VC1 = NewGameViewController
VC2 = GameViewController
NewGameViewController.m
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if( [segue.identifier isEqualToString:@"newGameSegue"]) {
GameViewController *gameVC = (GameViewController *)segue.destinationViewController;
NSArray *array = [self nameArrayForTextFieldArray:self.namePicker.textFieldArray withColon:YES];
gameVC.nameArray = [[NSArray alloc] initWithArray:array];
}
-(NSArray *)nameArrayForTextFieldArray:(NSArray *)array withColon:(BOOL *)bool
给定一个 nsarray 的文本字段,基本上返回一个 nsarray 的字符串。 withcolon 是一个 bool 值,表示您是否希望字符串末尾附加一个冒号。
当我调试我的代码时,gameVC 中的 _nameArray ivar 在调用这里的每一行之后仍然读取 nil...有人能帮我吗??
最佳答案
当即将执行从一个屏幕到另一个屏幕的转场时,UIKit 会调用 prepareForSegue 方法。它允许我们在显示之前将数据提供给新的 View Controller 。通常你会通过设置它的属性来做到这一点。
新的 View Controller 可以在 segue.destinationViewController 中找到。如果 GameViewController 嵌入了导航 Controller ,则新的 View Controller 将不是 GameViewController,而是嵌入它的导航 Controller 。 要获取 GameViewController 对象,我们可以查看导航 Controller 的 topViewController 属性。此属性指的是当前在导航 Controller 中处于事件状态的屏幕。
要将对象发送到新的 View Controller ,您可以使用此解决方案使用 performSegueWithIdentifier
:
例如,如果我们想在按下 UIButton
时执行一个 segue,我们可以这样做:
在 MyViewController.h
中,我们创建一个 IBAction(连接到 UIButton),将按钮从 Storyboard拖到代码中:
- (IBAction)sendData:(id)sender;
在MyViewController.m
中我们实现了方法:
- (IBAction)sendData:(id)sender
{
NSArray *array = [self nameArrayForTextFieldArray:self.namePicker.textFieldArray withColon:YES];
[self performSegueWithIdentifier:@"newGameSegue" sender:array];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"newGameSegue"]) {
UINavigationController *navigationController = segue.destinationViewController;
GameViewController *controller = (GameViewController *)navigationController.topViewController;
controller.nameArray = sender;
}
}
关于 Objective-C (iOS) : prepareForSegue won't pass my data into destination VC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11322431/