Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 分段目的地类型和类型;如何在代码中找到它们_Ios_Xcode_Ipad_Uistoryboard - Fatal编程技术网

Ios 分段目的地类型和类型;如何在代码中找到它们

Ios 分段目的地类型和类型;如何在代码中找到它们,ios,xcode,ipad,uistoryboard,Ios,Xcode,Ipad,Uistoryboard,有谁能告诉我如何使用if()语句来发现segue的目标视图控制器是出现在细节拆分中还是出现在主拆分中 我想把if()语句放在我的prepareforsgue:sender:方法中 编辑 我所有与此问题相关的详细视图(目前)都符合协议,我目前正在使用以下方法对目标控制器进行自省: if ([segue.destinationViewController conformsToProtocol:@protocol(myProtocol)])... 我可以看出,如果我愿意,这是行不通的: 为了能够随时

有谁能告诉我如何使用
if()
语句来发现segue的目标视图控制器是出现在细节拆分中还是出现在主拆分中

我想把
if()
语句放在我的
prepareforsgue:sender:
方法中

编辑

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

if ([segue.destinationViewController conformsToProtocol:@protocol(myProtocol)])...
我可以看出,如果我愿意,这是行不通的:

  • 为了能够随时在splitView的主视图或详细视图中显示同一类,同时
  • 我只希望在细节拆分中显示视图时if()语句为true
  • 像segue.destinationViewController.navigationController==…这样的东西似乎也没有任何用处

    我希望既然我们在设置segue时需要设置“主分割”或“细节分割”。。。有一种方法可以不那么迂回地访问这些信息

    第二次编辑:

    我用内省的方法来建立这种关系是“有效的”。它似乎不是很“面向对象”。我认为我根本不应该向视图控制器查询这些信息,我不明白为什么VC应该知道它将显示在splitView的哪一侧。当然,应该保留这些信息的对象是Segue,正如我所说,当我们选择“细节”或“主”分割时,它似乎是在故事板中“设置”的

    也许这不是什么财产,但我看不出该怎么做


    我想我可以在destinationViewController的视图中查询它,在它出现在屏幕上之后,会发现它在哪个NavigationController中,但是,它似乎有点“黑客化”。

    可能有一种更好的更抽象、更可重用的方法,我不知道,但这里有一个建议,可以帮助你的具体项目,只需要一点特殊的知识,你的具体项目

    如果您在准备segue时使用内省,您可以使用responsedto方法检查方法是否存在

    因此,例如,在splitview控制器的典型实现中(注意-并非全部),详图视图将实现处理旋转的方法。因此,如果这在您的项目中是真的,您可以这样做:

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

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

    希望有帮助,
    保持良好

    我的经验有点有限,但大多数时候我看到使用
    prepareForSegue
    时,
    if()
    块检查
    segue.identifier
    来做任何需要专门处理构建新页面的事情。如果您为所有segue设置了标识符,您可以只使用代码来处理来自该控制器的每个segue,并根据该segue是否转到masterViewController或detailViewController更改代码。这不是一种自动化程度很高的方法,但它可以完成工作


    编辑:哦,天哪,这个措辞有点让人困惑。如果你想让我写一个代码示例,但必须等到星期一,因为那时我才可以访问Mac。

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

    我认为您应该能够创建两个新类,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将发送给您的位置。这仍然不能解决问题中提到的第一个问题

  • “能够在主视图或详细视图中显示相同的类 不时拆分视图,同时
  • 这可以通过制作两份您希望能够显示为其中一个或两个视图的所有视图的副本来克服,然后将其中一份制作为UIMasterViewController,另一份制作为UIDetailViewController-复制粘贴对于其余的大部分都是好的


    让我知道这是否有效-我不确定如何设置我头顶上的控制器,但我非常确定这是可以做到的。如果可以的话,我认为这是一件非常有用的事情。

    谢谢你的支持。我用这个按钮做一些事情,这会很好。我已经从一个采用协议的类中对我的所有细节视图进行了子类化,所以我实际上也在做同样的事情,但是使用了
    conformsToProtocol
    。因为在设置segue时必须选择“detailsplit”或“mastersplit”,所以我认为可能有一种方法可以更直接地访问它。有时我想在任何一方展示同一个课程,而内省可能不起作用。谢谢。我需要比这更一般的东西,因为这将是子类很多,我不想依赖我的命名约定是那么僵硬。。。或者我的记忆…是的,这就是我想的,我想我应该尽快提出来。是的,这也行。我当时是先这么做的,但考虑到使用协议避免了子类的重复。它看起来不太面向对象。为了更清楚,我将再次编辑这个问题。非常感谢您的意见,再次表示感谢。