【问题标题】:Segue destination types & how to find them in codeSegue 目的地类型以及如何在代码中找到它们
【发布时间】:2012-09-29 11:02:36
【问题描述】:

谁能告诉我如何表达if () 语句来发现segue 的目标视图控制器是否会出现在细节拆分或主拆分中?

我想将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”。​​

【问题讨论】:

    标签: ios xcode ipad uistoryboard


    【解决方案1】:

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

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

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

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
        if ([segue.destinationViewController respondsToSelector:@selector(splitViewController:shouldHideViewController:inOrientation:)]) {
        //do something
    }
    

    }

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

    希望有帮助, 好好的

    【讨论】:

    • 谢谢。我正在使用按钮做一些事情,这会很好。我已经从一个采用协议的类中继承了我所有的细节视图,所以我实际上在做同样的事情,但使用conformsToProtocol。因为在设置 segue 时必须选择“详细拆分”或“主拆分”,所以我只是认为可能有一种方法可以更直接地访问它。有时我想在任何一方展示相同的课程,然后内省可能不起作用。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。我需要比这更通用的东西,因为这将被子类化很多,我不想依赖我的命名约定那么死板......或者我的记忆......
    • 是的,我就是这么想的,我想我还是提一下吧。
    【解决方案3】:

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

    我认为您应该能够创建 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. “为了能够在 Master 或 Detail 中显示相同的类 splitView 时不时,同时...”

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

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

    【讨论】:

    • 是的,这也可以。那时我首先这样做,但考虑到我认为使用该协议避免了重复我的子类的需要。它似乎不是很面向对象。为了更清楚,我将再次编辑问题。非常感谢您的意见,再次感谢您。
    猜你喜欢
    • 2016-10-12
    • 2019-07-28
    • 1970-01-01
    • 2014-08-31
    • 2014-09-24
    • 1970-01-01
    • 2018-01-24
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多