【问题标题】:Xcode 4.2 & Storyboard, how to pass data between views? Existing code errorXcode 4.2 & Storyboard,如何在视图之间传递数据?现有代码错误
【发布时间】:2012-03-29 05:53:05
【问题描述】:
我正在尝试学习如何在视图之间传递数据。假设从输入到第一个视图的文本字段中的文本在第二个视图中设置标签。我基本上已经尝试在第二个视图中创建一个字符串,然后当从第一个视图切换到第二个视图时,我在第二个视图中设置了一个字符串。然后,当第二个视图加载时,它会将标签的文本设置为相同的字符串。我 NSLog 在转换之前和之后,在它正常之前,但是当第二个视图加载它时,它的字符串被删除。我不确定为什么这不起作用。这是我的项目:http://www.mediafire.com/?83s88z5d06hhqb5
谢谢!
-Shredder2794
【问题讨论】:
标签:
iphone
ipad
xcode4.2
storyboard
【解决方案1】:
来自我的书 (http://www.apeth.com/iOSBook/ch19.html#_storyboards):
在执行 segue 之前,会向源视图控制器发送 prepareForSegue:sender:。视图控制器可以通过检查 segue 的标识符和destinationViewController 属性来确定正在触发什么 segue,并且发送者是被点击以触发 segue 的接口对象(或者,如果在代码中调用了 performSegueWithIdentifier:sender:,则无论是什么对象作为sender: 参数提供)。这是源视图控制器和目标视图控制器相遇的时刻;因此,源视图控制器可以在目标视图控制器上执行配置、向其传递数据等等。
(当然另一种解决方案是“不使用情节提要”。然后第一个视图控制器创建第二个视图控制器,然后可以在那里传递数据。)
相反的问题要棘手得多;查看 Utility Application 模板,了解如何使用委托模式的示例。
【解决方案2】:
故事板是现成的东西,您可以在其中减少编写的大量代码。因此请考虑故事板上的控制器 A 和 B。
现在,为了将数据从 A 传递到 B,您可以使用 segue 名称和标识符将它们连接起来,然后您可以将 A 中的委托方法用作:
//这个方法在从 A 到 B 的转换之前被调用。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"THE IDENTIFIER YOU NAMED"])
{
id *objectOfController_B = [segue destinationViewController];.
objectOfController_B.lblTextDisplayOfA = //Something...
}
}
现在您可以使用控制器 A 中的按钮显式转换它。
- (IBAction)buttonPressed:(id)sender
{
[self performSegueWithIdentifier:@"THE IDENTIFIER YOU NAMED" sender:sender];
}
所以我想您可以尝试对此进行试验,您将了解 segue 发生转换的方式和时间。
希望这会有所帮助。