Objective c iOS中的故事板关系

Objective c iOS中的故事板关系,objective-c,ios,xcode4,ios5,uistoryboard,Objective C,Ios,Xcode4,Ios5,Uistoryboard,我正在尝试使用新的故事板功能,但是我对故事板的关系感到困惑?它们与IBO有什么不同 另外,如何将自己的关系添加到自己的UIViewController子类中 我试着查看文档,但找不到太多关于它们的信息。我在我的网站上写了一些关于如何使用故事板的教程 也许这会有点帮助?本质上,序列关系为情节提要上两个项目之间的链接提供了标识符。您可以使用这些标识符来管理事物的工作方式。我的理解是:关系是iOS表示“父子”关系的方式,虽然这看起来非常递归,但父子关系的一个示例是包含UIViewControlle

我正在尝试使用新的故事板功能,但是我对故事板的关系感到困惑?它们与IBO有什么不同

另外,如何将自己的关系添加到自己的UIViewController子类中


我试着查看文档,但找不到太多关于它们的信息。

我在我的网站上写了一些关于如何使用故事板的教程


也许这会有点帮助?本质上,序列关系为情节提要上两个项目之间的链接提供了标识符。您可以使用这些标识符来管理事物的工作方式。

我的理解是:关系是iOS表示“父子”关系的方式,虽然这看起来非常递归,但父子关系的一个示例是包含UIViewController的UIViewController容器

不管怎样,这就是理论——使用UINavigationController可以更好地理解它。它之所以被称为“容器”,是因为它在“堆栈”隐喻中包含尽可能多的常规UIViewController,因此您可以进行常规的UITableView向下钻取和弹出

关键的一点是,UINavigationController和堆栈中第一个UIViewController之间的segue存在“关系”,而所有其他UIViewController之间的segue只是一个常规推送segue

同样的事情在UISplitViewController中也很明显——它从启动时就需要两个视图控制器(有时称为内容视图控制器),它们连接在父UISplitViewController(容器)和两个常规(内容)视图控制器之间

(因此,关系不像IBOutlets,而是更像segues——它们甚至在标准视图控制器容器的“segues”类别中)

现在-我们不允许对标准视图控制器容器进行子类化,但我们可以创建自定义视图控制器容器,但我不能在自定义视图控制器容器中定义关系


因此:“我可以在我自己的控制器中使用它们吗?”答案仍然未知(至少对我来说,文档最多也很薄)

创建UIStoryboardSegue的子类,如下所示:

@implementation JTARelationshipSegue

- (void)perform
{
  return;
}

@end
- (void)viewDidLoad
{
  ...
  [self performSegueWithIdentifier:@"addChild" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  UIViewController *destination = [segue destinationViewController];
  [self addChildViewController:destination];
  ...
}
在两个对象之间创建自定义segue,并将类设置为JTARelationshipSegue。在视图控制器中,使视图控制器执行如下步骤:

@implementation JTARelationshipSegue

- (void)perform
{
  return;
}

@end
- (void)viewDidLoad
{
  ...
  [self performSegueWithIdentifier:@"addChild" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  UIViewController *destination = [segue destinationViewController];
  [self addChildViewController:destination];
  ...
}
您需要在interface builder中将segues标识符设置为addChild

弹射
prepareforsgue:sender
,以便将segues目标视图控制器添加为当前视图控制器的子级,如下所示:

@implementation JTARelationshipSegue

- (void)perform
{
  return;
}

@end
- (void)viewDidLoad
{
  ...
  [self performSegueWithIdentifier:@"addChild" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  UIViewController *destination = [segue destinationViewController];
  [self addChildViewController:destination];
  ...
}
对于要创建的每个子级,您需要有一个不同的segue标识符(或标识特定视图控制器的另一种方式)

这将使您的故事板文件看起来更漂亮、更可读,但是您最好只加载其他视图控制器,并将其作为子视图添加到视图加载方法中:

- (void)viewDidLoad
{
   [self addChildViewController:
         [[self storyboard] 
          initiateViewControllerWithIdentifier:@"myIdent"]];
...
}

那么,这与IBOutlet有什么不同呢?我如何在自己的控制器中使用它们呢?当您创建segue时,它允许您指定一个标识符。您使用该标识符来检查该segue当前是否正用于从一个控制器(或其他)转换对于另一个。您实际上没有以任何其他方式使用它们-因此它们在这方面与iboutlet不同。它们还用于确定如何推送新视图(推送/模式/弹出窗口等)。我链接的教程展示了如何在您自己的控制器中使用它们。更新的教程链接,最近在网站移动后被破坏。我认为这是无法解释/未经调查的向下投票的原因。这很聪明,尽管使用segue似乎不是100%正确的方式。我不认为UINavigationController这样做是为了暴露e rootViewController关系…但谁知道呢。这完全有效,我现在正在我的故事板中连接,以便于您的方法的可读性。