【问题标题】:iOS Storyboard Loose Connection?iOS 故事板松散连接?
【发布时间】:2012-05-24 09:57:38
【问题描述】:

我有一个非常简单的应用程序,它只有 2 个视图控制器。初始根控制器上有两个 UIButton,它们都通过 Storyboard 转换到第二个视图控制器。在第二个视图控制器上加载的信息由链接到两个初始视图控制器的 buttonPressed IBAction 确定。我遇到的问题是,一旦我点击两个按钮之一,我就会让第二个视图控制器加载空白。从调试中,我注意到 buttonPressed 函数在第二个视图加载后被调用。如何在第二个视图控制器加载空白之前调用 buttonPressed 函数?

几乎不涉及任何代码,我将 UIButtons 标记为 1 和 2,并且按钮按下功能根据等于 1 或 2 的发件人标记加载两个文本文件。所有内容都在 Storyboard 中链接。有什么建议吗?

*按钮按下功能:

if([发件人标签] == 1)

count = 1;

其他

count = 2;

计数决定要加载的文件。

*在 Storyboard 中,我只有 2 个视图控制器(没有导航或任何其他)和初始视图上的两个 UIButtons 和第二个用于显示文本的文本视图。 UIButtons 连接到 buttonPressed 和第二个视图控制器 segue。

【问题讨论】:

  • 您能显示您的按钮操作的代码吗?另外,您是否使用 segues 来切换视图控制器?你有 UINavigationController 吗?
  • 我编辑了它,希望它现在更有意义。
  • 是每个按钮都有自己的 segue 还是两个都使用相同的 segue?
  • 两个按钮的segue分开,但它们在同一个地方。

标签: iphone ios xcode storyboard viewcontroller


【解决方案1】:

不要为按下按钮的 IBAction 烦恼。让按钮连接到新控制器并使用prepareForSegue:sender: 确定哪个按钮被点击(发送者)。

然后,您可以获得对您的控制器的引用,该引用将出现类似...

SecondController *next = (SecondController *)[segue destinationViewController];

...并告诉它要加载哪个文件,它可以在viewDidLoad: 中执行。

【讨论】:

  • 这怎么比 IBAction 更好?
  • 它不依赖于被调用的事物的顺序,它利用了您使用故事板这一事实。
  • 那么这里的顺序为什么会出错?为什么不立即调用 buttonPressed 函数然后加载视图?
  • 我不确定这是错的,因为我不知道他们定义的哪个地方会先发生。例如,我知道如果 segue 来自表格单元格,则顺序不是我所期望的。
  • 嗯,这是我为我的较大的应用程序制作的一个测试应用程序。 buttonPressed 在按下后立即加载,然后在另一个视图上加载信息。它适用于 5 个按钮中的 3 个,但其他 2 个按钮与我上面描述的问题相同。
【解决方案2】:

这听起来像是prepareForSegue的案例!

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"First Button Segue Identifier"])
    {
        ViewController *theViewController = segue.destinationViewController;
        theViewController.textProperty = self.firstButtonText;
    } 
    else if ([[segue identifier] isEqualToString:@"Second Button Segue Identifier"])
    {
        ViewController *theViewController = segue.destinationViewController;
        theViewController.textProperty = self.secondButtonText;
    }
}

你去吧,它很通用,因为我不知道你的变量名或你使用的文本。同样,如果 segues 没有单独的标识符,您可以使用 sender 来确定正在按下哪个按钮。

祝你好运!

【讨论】:

  • 我可以先在 storyboard 中实现 viewController,然后在 prepareForSegue 中以编程方式设置目标吗?
  • 不,目的地是在情节提要中设置的。 UIStoryboardSegue 有一个“destinationViewController”属性,它指向您在情节提要中链接到的视图控制器。所以我们在这里所做的是从 segue 的属性中获取 viewController 并使用我们想要的任何信息分配该视图的属性。您需要将 ViewController 替换为您调用的第二个视图控制器类,并将 textProperty 替换为您用于确定要显示的文本的任何属性。
  • 如果我重写 prepareForSegue 函数,从现在开始我是否必须管理整个项目中的每个 segue?
  • 不,你没有管理 segue。在你让它做某事之前,这个函数什么都不做。 segue 将自行转换,这只是让您在 segue 之前暂停并为转换“准备”。无论如何,segue 仍然会发生。你可以有 15 个不同的 segues,并且在这个函数中只捕获其中两个并实际做一些事情,而其他 13 个会像什么都没发生一样继续前进。
  • 成功了!我所做的只是将我的 buttonPressed 代码添加到 prepareForSegue。效率不是很高,但确实有效。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2012-09-24
  • 2012-06-25
  • 2012-08-22
  • 1970-01-01
  • 2012-01-02
  • 2020-04-18
相关资源
最近更新 更多