1

我正在看 WWDC 2014 视频,“ 212:OS X 上的故事板和控制器”。在这个视频中,他们声称 Pages UI 确实/可以使用 OS X 上的 Storyboards 进行排列(见下文)。

212 的屏幕截图:OS X 上的故事板和控制器,显示 XCode 6 中的故事板布局

但是,在 Pages UI 中,检查器视图很长并且嵌入在滚动视图中(您可以在 Page.app 检查器视图中验证我的两指滚动),一些检查器项目本身也包含在(某种类型的自定义)中披露观点。似乎不可能在滚动视图中嵌入故事板视图控制器,因为没有对应于“滚动视图控制器”类。那正确吗?

故事板视图控制器的视图如何嵌入到故事板上的滚动视图中?

我已经尝试在运行时直接嵌入,但是,这非常hackish并且不能可靠地工作(自动布局的问题)。这条路线可能仍然可行,但我想在走得太远之前获得建议。对于真正的 UI,可能会退回到 XIB。

- (void)viewDidLoad {

    [super viewDidLoad];

    // Swap the view controllers' view for a scroll view
    NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:self.view.frame];
    scrollView.documentView = self.view;
    scrollView.drawsBackground = NO;
    self.view = scrollView;
}
4

2 回答 2

0

我认为这个答案并不能真正解决您的问题,但可能有助于理解故事板和滚动视图的内容。我认为苹果仍然需要解决一些故事板问题。我尝试将集合视图与情节提要一起使用,但无法在界面构建器中连接 collectionViewItem(这是通过 xibs 自动发生的)。

以下是集合视图的示例:

  1. 将集合视图拖放到 viewController。您将看到一个集合视图和一个 collectionViewItem 出现。但是集合视图项未连接到集合视图。如果您使用 IB 尝试此操作,则不会发生任何事情。
  2. 在 IB 的身份检查器中分配一个 Soryboard ID。这是一个随机名称,稍后将在代码中使用。在这里我使用“MyCollectionView”
  3. 如果使用 swift,请在 Module 中选择您的项目名称。objC 的代码基本相同
  4. 将集合视图连接到 ViewController,包含集合视图

做一些编码来连接 Collection View 项目

class IVMyCollectionViewController: NSViewController, NSCollectionViewDelegate {

// manual connections to collection view (which is not working in IB)
@IBOutlet weak var collectionView: NSCollectionView!

class var sharedInstance : IVMyCollectionViewController {

    struct Static {

        static var instance:IVMyCollectionViewController? = nil
    }

    if Static.instance != nil {

        return Static.instance!
    } else {

        let bundle      = NSBundle.mainBundle()
        let infoDict    = bundle.infoDictionary!
        let sbName      = infoDict["NSMainStoryboardFile"] as String
        let storyboard  = NSStoryboard(name:sbName, bundle:bundle)!
        let vcName      = "MyCollectionView"
        let sbInstance  = storyboard.instantiateControllerWithIdentifier(vcName) as IVMyCollectionViewController

        Static.instance = sbInstance

        return sbInstance
    }
}

// implement your controller

}

这意味着一些UI 元素尚未正确实现。我会向苹果发送错误报告。界面构建器中仍然缺少很多东西。

现在,我将使用故事板和 xib 的混合物,通过在控制器的构造函数中实例化连接来以上述方式滥用故事板。您可以使用 storyboardID 来启动视图和其他视图或从 xibs 加载。您可以将 viewControllers 放置在没有连接(segues)的情节提要中,以创建可以像 xibs 一样使用的视图池。(viewController 和 xib 差不多)

// objC
DetailViewController* controller = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];

或使用上面的 storyboardID 实例化。

尝试在情节提要中创建滚动视图。为每个视图创建您希望在 viewControllers 中显示的视图。您的滚动视图视图控制器应该与滚动视图本身有连接。在下面的例子中,滚动视图的出口被命名为“self.contentView”:

// instantiate a view controller for your scrolling view
self.scrollingViewController = [[ScrollingViewController alloc] initWithNibName:@"ScrollingView" bundle:nil];

// or do the same with storyboards by instantiating view controllers by ID
self.scrollingViewController = [myStoryboard instantiateControllerWithIdentifier:@"MyScrollingViewID"];

// Then set the view from the controller as content view
[self.contentView setDocumentView:self.scrollingViewController.view];
[self.contentView.contentView scrollPoint:NSMakePoint(0., self.scrollingViewController.view.frame.size.height)];

这就像混合目标 C 和 swift 代码一样。苹果似乎进入了一条没有走到尽头的转型之路。

一般来说,您应该认为情节提要中的 View- 或 WindowController 与完整的 xib 文件相同。如果您想使用更多视图,请在情节提要中使用容器视图。xibs 中的 FilesOwner 是 storyboards 中的 viewController。容器视图使您能够创建附加到视图控制器的几个视图。segue 机制可用于容器。我认为 OS X 的滚动视图机制并不优雅。我也为此苦苦挣扎。

祝你好运!

于 2014-12-12T12:01:26.507 回答
0
  1. 创建将成为滚动视图的文档视图的视图。
  2. 选择该视图
  3. 转到编辑器>嵌入>滚动视图

基于Mac 的 Scroll View Programming Guide这一页

于 2015-11-16T22:14:52.090 回答