1

谁能告诉我如何用if ()语句来发现 segue 的目标视图控制器是否会出现在 Detail Split 或 Master Split 中?

我想把if()声明放在我的prepareForSegue:sender:方法中。

编辑

我所有与这个问题相关的详细视图(目前)都符合协议,我目前正在使用以下方法对目标控制器进行自省:

if ([segue.destinationViewController conformsToProtocol:@protocol(myProtocol)])...

我可以看到,如果我愿意,这是行不通的:

  1. 为了能够不时在 splitView 的 Master 或 Detail 中显示相同的类,同时...
  2. 我只希望在要在细节拆分中显示视图时 if() 语句为真。

诸如此类的东西似乎segue.destinationViewController.navigationController == ...也没有任何用处。

我希望,因为我们需要在设置 segue 时设置“Master Split”或“Detail Split”……有一种方法可以不那么迂回地访问这些信息。

第二次编辑:

我使用内省进行此设置的方式确实“有效”。它似乎不是很“面向对象”。我认为我根本不应该查询视图控制器来获取这些信息,我不明白为什么 VC 应该知道它将显示在 splitView 的哪一侧。当然,应该保留此信息的对象是 Segue,正如我所说,当我们选择“细节”或“主”拆分时,它似乎正在情节提要中“设置”。

也许它不是任何东西的属性,但我不知道如何得到它。

我想我可以在它的 viewWillAppear 中查询destinationViewController 以发现它出现在屏幕上后它所在的NavigationController,但同样,它似乎有点“hacky”。

4

3 回答 3

1

我的经验有点有限,但我见过的大多数prepareForSegue情况下,if()块检查segue.identifier以执行任何需要专门用于处理构建新页面的操作。如果为所有 segue 设置标识符,则可以只使用代码来处理来自该控制器的每个 segue,并根据该 segue 是转到 masterViewController 还是 detailViewController 来更改代码的内容。这不是一种真正自动化的方式,但它可以完成工作。

编辑:哦,天哪,这个措辞有点令人困惑。如果你想要我,我可以放一个代码示例,但它必须等到星期一,因为在那之前我无法使用 Mac。

于 2012-09-29T15:11:31.613 回答
1

我不知道可能有更好的更抽象和可重用的方法来做到这一点,但这里有一个建议可以帮助您的特定项目,只需要对您的特定项目有一点特殊知识。

如果您在为 segue 做准备时使用自省,则可以使用对方法的响应来检查方法是否存在。

因此,例如,在 splitview 控制器的典型实现中(注意 - 不是全部),详细视图将实现处理旋转的方法。因此,如果这在您的项目中是正确的,您可以执行以下操作:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([segue.destinationViewController respondsToSelector:@selector(splitViewController:shouldHideViewController:inOrientation:)]) {
    //do something
}

}

您可以基于与主视图或详细视图相关的项目中独特但不变的内容使用相同的方法。

希望有帮助,一切都好

于 2012-09-29T14:49:34.507 回答
0

关于课程和协议的讨论给了我另一个想法,但同样,我不确定它是否会起作用——我想在发布之前对其进行测试,但我不会很快有时间进行测试。

我认为您应该能够创建 2 个新类 UIMasterViewController 和 UIDetailViewController,它们只是 UIViewController 的子类。然后,对于每个实际屏幕,不要直接将它们设为 UIViewController 的子类,而是将它们设为 UIDetailViewController 或 UIMasterViewController。然后,在你的prepareForSegue,

if ([segue.destinationViewController isKindOfClass:UIMasterViewController])
{
  //do master view specific stuff
}
else if ([segue.destinationViewController isKindOfClass:UIDetailViewController])
{
  //do detail view stuff here
}

只要您可以正确设置自定义视图控制器类,这应该是一种非常可靠的方式来告诉您的 segue 将您发送到哪里。这仍然不能解决问题中提到的第一个问题

  1. “为了能够不时在 splitView 的 Master 或 Detail 中显示相同的类,同时......”

这可以通过制作 2 个您希望能够显示为其中一个或两个的所有视图的副本来克服,然后将一个作为 UIMasterViewController 和另一个作为 UIDetailViewController - 复制粘贴应该对其余大部分都有好处。

让我知道这是否可行 - 我不完全确定如何在我的头顶上设置控制器,但我很确定它可以完成。如果可以的话,我可以看到这是一件非常有用的事情。

于 2012-10-02T16:44:42.347 回答