首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSSplitviewController以编程方式

NSSplitviewController以编程方式
EN

Stack Overflow用户
提问于 2017-06-01 13:37:08
回答 1查看 4.6K关注 0票数 5

我有一个NSSplitViewController,它有两个视图控制器作为splitViewItems。这个很好用。

现在,我想在故事板中为我的SplitViewController设置一个自己的Splitviewcontroller类。我给它我自己的课,开始应用程序。但现在我只看到一扇空窗户。

如果我设置了自己的splitviewcontroller类,那么我现在是否以编程的方式设置了我的splitviewcontroller?

如果是,我必须使用哪些代码再次显示我的splitview控制器中的两个视图控制器?

更新

代码语言:javascript
复制
import Cocoa

class SplitViewController: NSSplitViewController {
    override func viewDidLoad() {
       print("Test")
    }
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-15 15:35:37

这里有一个Xcode 9游乐场(Swift 4),它展示了如何从代码中设置NSSplitViewController

代码语言:javascript
复制
import Cocoa
import PlaygroundSupport

class ViewController: NSViewController {

   private let backgroundColor: NSColor

   init(backgroundColor: NSColor) {
      self.backgroundColor = backgroundColor
      super.init(nibName: nil, bundle: nil)
   }

   required init?(coder: NSCoder) {
      fatalError("init(coder:) has not been implemented")
   }

   override func loadView() {
      view = NSView()
      view.wantsLayer = true
      view.layer?.backgroundColor = backgroundColor.cgColor
   }
}


class MainSplitViewController: NSSplitViewController {

   private let splitViewResorationIdentifier = "com.company.restorationId:mainSplitViewController"

   lazy var vcA = ViewController(backgroundColor: .red)
   lazy var vcB = ViewController(backgroundColor: .green)
   lazy var vcC = ViewController(backgroundColor: .blue)

   override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) {
      super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
      setupUI()
      setupLayout()
   }

   required init?(coder: NSCoder) {
      super.init(coder: coder)
   }

}


extension MainSplitViewController {

   private func setupUI() {

      view.wantsLayer = true

      splitView.dividerStyle = .paneSplitter
      splitView.autosaveName = NSSplitView.AutosaveName(rawValue: splitViewResorationIdentifier)
      splitView.identifier = NSUserInterfaceItemIdentifier(rawValue: splitViewResorationIdentifier)
   }

   private func setupLayout() {

      minimumThicknessForInlineSidebars = 180

      let itemA = NSSplitViewItem(sidebarWithViewController: vcA)
      itemA.minimumThickness = 80
      addSplitViewItem(itemA)

      let itemB = NSSplitViewItem(contentListWithViewController: vcB)
      itemB.minimumThickness = 100
      addSplitViewItem(itemB)

      let itemC = NSSplitViewItem(viewController: vcC)
      itemC.minimumThickness = 80
      addSplitViewItem(itemC)
   }

}

let vc = MainSplitViewController()
vc.view.frame = CGRect(x: 0, y: 0, width: 400, height: 300)

PlaygroundPage.current.liveView = vc

更新

版本类似于上面的版本,但目标是macOS 10.10。

代码语言:javascript
复制
import Cocoa
import PlaygroundSupport

class ViewController: NSViewController {

   private let backgroundColor: NSColor

   init(backgroundColor: NSColor) {
      self.backgroundColor = backgroundColor
      super.init(nibName: nil, bundle: nil)
   }

   required init?(coder: NSCoder) {
      fatalError("init(coder:) has not been implemented")
   }

   override func loadView() {
      view = NSView()
      view.wantsLayer = true
      view.layer?.backgroundColor = backgroundColor.cgColor
   }
}


class MainSplitViewController: NSSplitViewController {

   private let splitViewResorationIdentifier = "com.company.restorationId:mainSplitViewController"

   lazy var vcA = ViewController(backgroundColor: .red)
   lazy var vcB = ViewController(backgroundColor: .green)
   lazy var vcC = ViewController(backgroundColor: .blue)

   override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) {
      super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
      setupUI()
      setupLayout()
   }

   required init?(coder: NSCoder) {
      super.init(coder: coder)
   }

}


extension MainSplitViewController {

   private func setupUI() {

      view.wantsLayer = true

      splitView.dividerStyle = .paneSplitter
      splitView.autosaveName = NSSplitView.AutosaveName(rawValue: splitViewResorationIdentifier)
      splitView.identifier = NSUserInterfaceItemIdentifier(rawValue: splitViewResorationIdentifier)

      vcA.view.widthAnchor.constraint(greaterThanOrEqualToConstant: 80).isActive = true
      vcB.view.widthAnchor.constraint(greaterThanOrEqualToConstant: 100).isActive = true
      vcC.view.widthAnchor.constraint(greaterThanOrEqualToConstant: 80).isActive = true
   }

   private func setupLayout() {

      let sidebarItem = NSSplitViewItem(viewController: vcA)
      sidebarItem.canCollapse = true
      sidebarItem.holdingPriority = NSLayoutConstraint.Priority(NSLayoutConstraint.Priority.defaultLow.rawValue + 1)
      addSplitViewItem(sidebarItem)

      let xibItem = NSSplitViewItem(viewController: vcB)
      addSplitViewItem(xibItem)

      let codeItem = NSSplitViewItem(viewController: vcC)
      addSplitViewItem(codeItem)
   }

}

let vc = MainSplitViewController()
vc.view.frame = CGRect(x: 0, y: 0, width: 400, height: 300)

PlaygroundPage.current.liveView = vc
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44309088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档