【问题标题】:Can't understand the storyboards in xcode 5无法理解 xcode 5 中的情节提要
【发布时间】:2013-10-15 09:52:13
【问题描述】:

我无法理解 xcode 5 中的情节提要。我正在通过手册寻找答案,但没有任何效果,即使是简单的情节提要场景。几乎所有的手册都在 xcode 4.x 上,但我在第五个工作。据我了解,xcode 4 和 5 中的场景实现之间存在一些差异。我根本无法理解情节提要的原理,因此不明白为什么没有任何效果。请帮助我了解 xib 和故事板之间的区别。什么最适合工作以及在什么条件下工作?我拥有的所有书籍都是关于 IOS 6 的,它们都带有 xib 示例,我什至无法在第五个 xcode 中运行。在 developer.apple.com 上找不到足够的文档,大家都很困惑。 Аs 据我所知,关于 xcode 5 + IOS 7 的书籍将在几个月后发布。请帮我制定这个方案,表格视图中的单元格是静态的。链接到方案https://www.dropbox.com/s/mwwfqgsj2d98exe/Scheme.jpg

【问题讨论】:

  • 你不需要故事板,如果你有自定义转换等等,它会使事情变得更复杂,不要费心只使用普通的 xibs 作为你的视图。

标签: uitableview storyboard ios7 segue xcode5


【解决方案1】:

这是对 Xcode 5 中情节提要的说明,以及如何在下图中概述的方案中确定的不同场景之间建立联系的具体说明:

从大局开始:

  1. 要在一个场景或另一个场景之间进行转场,您可以从一个 view controller 按住 ctrl 并拖动到目标 view controller(您不再需要按住 ctrl-click 从控件到不同的观点)
  2. 在源场景(文档大纲视图)中单击创建的转场
  3. 在身份检查器中为 segue 标识符创建一个唯一名称
  4. 现在任何控件都可以调用以下视图控制器方法来 执行转场 - (void)performSegueWithIdentifier:(NSString *)标识符发件人:(id)发件人
  5. 可以通过实现 源视图控制器上的以下方法:- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

具体到您的方案:

在情节提要中: 文档大纲内部(编辑器 > 显示文档大纲):

展开两个场景

  1. 在 ViewController1 到 ViewController2 之间按住 Ctrl 并拖动
  2. 在源场景中,点击创建的segue并在identity中设置标识符 督察
  3. 在源视图控制器中,创建上述 prepareForSegue 以访问和传递任何 视图控制器之间的数据对象(确保你有一个属性 在目标视图控制器上,您使用 segueIdentifier 来控制要发送的数据)
  4. 在两个按钮的操作方法中,使用 View2 和 View5 的不同 ID 调用各自的 segue [self performSegueWithIdentifier:@"MYSEGUE_ID" sender:btnObjectNilEtAl];
  5. 要向其他视图控制器渲染 segue,只需重复 ctrl-drag 过程 在源视图控制器和目标视图控制器(View2 到 View4/View5)之间。
  6. 要让 segues 从 tableview 单元格中使用,只需添加 [self performSegueWithIdentifier:@"MYSEGUE_ID" 发件人:btnObjectNilEtAl];代码到 didSelectRowAtIndexPath 方法中。

这里有一些代码示例可以帮助您入门:

// In a story board-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    if ([[segue identifier] isEqualToString:@"showDealDetail"])
    {
        // Get reference to the destination view controller
        DealDetailViewController *dvc = [segue destinationViewController];

        // Pass any objects to the view controller here, like...
        [dvc setDetailObject:(NSManagedObject*)sender];
    } else if ([[segue identifier] isEqualToString:@"showActivityDetail"])
    {
        ActivityDetailViewController * advc = [segue destinationViewController];

        // Pass any objects to the view controller here, like...
        [advc setDetailObject:(NSManagedObject*)sender];
    } else if ( [[segue identifier] isEqualToString:@"showMatchDetail"])
    {
        MatchDetailViewController * mdvc = [segue destinationViewController];

        // Pass any objects to the view controller here, like...
        [mdvc setDetailObject:(NSManagedObject*)sender];
    }
}

从 ViewController1 内的两个按钮动作方法调用:

 //execute manual segue
        [self performSegueWithIdentifier:@"showAlternate" sender: self];

【讨论】:

  • 抱歉,不太明白。我决定简化我的方案dropbox.com/s/o82fxpte0hmyxcq/Scheme_Simple.jpg,但它不起作用。据我了解,我应该从 View2 设置导航控制器和表格视图的单元格。
  • Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'buttonOneSegue'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.
  • @SashaKid - 错误表明您正在尝试使用 push segue 样式。如果您从导航控制器开始,您只能这样做,否则您必须使用模态或自定义作为您当前的 segue 样式。如果您将源控制器更改为导航控制器,并且仅在那时,您将使用推送 segue。修复 - 通过选择 segue 并在属性检查器中选择模式来更改 segue 样式。除了注意您需要在 viewcontroller2 上设置一个属性来保存您想要在 prepareForSegue 中传递的任何数据之外,您的代码没有任何问题。
  • @SashaKid - 请记住,在情节提要中,您在视图控制器而不是视图对象之间拖动 segues。然后从源视图控制器(无论您从哪个方向开始)调用上述两种方法。因此,如果您将不同的 segue 从 vc2 拖回 vc1,您将使用相同的方法集以另一种方式推送数据,但您可能希望在返回 vc1 时使用 [self dismissViewController... 调用来卸载 vc2。希望对您有所帮助,并且在您感到舒适后不要忘记标记答案。
猜你喜欢
  • 2011-12-07
  • 2013-11-30
  • 1970-01-01
  • 2014-07-16
  • 2014-12-24
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多