【问题标题】:NSSplitViewController in OSX 10.10 using Xcode 6OSX 10.10 中使用 Xcode 6 的 NSSplitViewController
【发布时间】:2014-11-17 21:54:35
【问题描述】:

根据 NSSplitViewControllers 上的文档,关联的 NSSplitView 使用 NSSplitViewController 作为其委托。具体在文档中,“拆分视图控制器充当其拆分视图对象(管理分隔符的对象)的委托。如果您覆盖拆分视图委托方法,则您的覆盖必须调用 super。”

我在界面生成器中实现了一个 NSSplitViewController 并给它一个类。但是,从未调用过任何 splitView 委托。此外,如果我只是做一些类似吐谁 splitView 委托 [ NSLog (@"%@", self.splitView.delegate); ],结果为“空”。但是,如果我在 IB 本身(通过将委托出口拖到 NSSplitViewController)或内部代码([self.splitView setDelegate:self];)分配委托,我会收到以下错误:

引发了未捕获的异常
SplitViewController 的 splitView 无法使用自动布局,因为 SplitViewController 覆盖了不兼容的委托方法。

我完全糊涂了。

【问题讨论】:

    标签: objective-c xcode nssplitview


    【解决方案1】:

    如果拆分视图的委托实现了以下方法之一,它将与自动布局不兼容。

    splitView:constrainMinCoordinate:ofSubviewAt:
    splitView:constrainMaxCoordinate:ofSubviewAt:
    splitView:resizeSubviewsWithOldSize:
    splitView:shouldAdjustSizeOfSubview:
    

    https://developer.apple.com/library/mac/releasenotes/AppKit/RN-AppKitOlderNotes/#10_8AutoLayout


    而且由于 NSSplitViewController 需要使用自动布局(文档中提到),这些方法与 NSSplitViewController 不兼容,不应该在子类中实现。

    【讨论】:

    • 谢谢!我最初对此感到非常困惑,因为我认为唯一的选择是低(250)和高(750),当我这样做时,我没有得到我所期望的行为。通过将子视图 0 保持模式更改为 260 并将子视图 1 保持模式保持在 250,我得到了我想要做的事情。非常感谢!
    • 谢谢!这些信息没有写在任何地方的文档中!
    【解决方案2】:

    扩展泰勒的答案。

    在 macOS 10.8 中,Apple 对 NSSplitview 进行了改进,其中包括尊重子视图的约束。苹果还为 NSSplitview 的子视图引入了持有优先权。 Hold Priority是保持子view大小的优先级,所以在调整splitview的大小时,优先级最低的子view会先调整大小。

    因此,要控制调整大小的行为,您必须调整 SplitView 项目的持有优先级。这也可以直接在情节提要中完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 2015-01-22
      相关资源
      最近更新 更多