Objective-C(iOS):prepareForSegue不会将我的数据传递到目标VC

bri*_*San 0 xcode objective-c ios

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];
}
Run Code Online (Sandbox Code Playgroud)

-(NSArray *)nameArrayForTextFieldArray:(NSArray *)array withColon:(BOOL *)bool 在给定nsarray文本字段的情况下,它基本上返回一个字符串的nsarray.withcolon是一个bool,你是否希望字符串附加一个冒号到末尾.

当我调试我的代码时,gameVC中的_nameArray ivar在调用每一行之后仍然读取nil ...有人可以帮助我吗?

and*_*van 7

当即将执行从一个屏幕到另一个屏幕的segue时,UIKit调用prepareForSegue方法.它允许我们在显示之前将数据提供给新的视图控制器.通常你会通过设置它的属性来做到这一点.

可以在segue.destinationViewController中找到新的视图控制器.如果GameViewController嵌入了导航控制器,新的视图控制器将不是GameViewController,而是嵌入它的导航控制器.要获取GameViewController对象,我们可以查看导航控制器的topViewController属性.此属性指的是导航控制器中当前处于活动状态的屏幕.

要将对象发送到新视图控制器,您可以使用以下解决方案performSegueWithIdentifier:

例如,如果我们想执行一个segue按a,UIButton我们可以这样做:

MyViewController.h我们创建一个IBAction(连接到UIButton),将按钮从故事板拖动到代码:

- (IBAction)sendData:(id)sender;
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)