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

时间:2012-07-04 04:30:03

标签: objective-c ios xcode

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是一个不知道你是否希望字符串附加一个冒号到底的人。

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

3 个答案:

答案 0 :(得分:7)

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

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

要将对象发送到新视图控制器,您可以使用performSegueWithIdentifier

来使用此解决方案

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

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

- (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;
    }
}

答案 1 :(得分:0)

GameViewController是否嵌入在导航控制器中?在这种情况下,您的destinationViewController属性是UINavigationController类型,而不是GameViewController。您可以通过调用[segue.destinationViewController.viewControllers lastObject]来获取GameViewController。

答案 2 :(得分:0)

我假设您在设置array之前已经在gameVC.nameArray完成了NSLog(或在调试器中检查)。你真的想确保它按你认为的那样设置。令人惊讶的是,有多少次我花了这么多时间来调试这个问题只是为了意识到这个问题与我nameArrayForTextFieldArray相当。或者是segue标识符名称的拼写错误。或者随机的事情。

假设没问题,那么可能会有以下几点:

  1. nameArray中的GameViewController属性是如何定义的?如果它不是strong引用(或copy),那么当您的array超出范围时,它将被取消分配。我认为这会略有不同,但值得证实。

  2. 此外,我已经看到像GameViewController这样的控制器可能在各种ivars和属性之间产生混淆的情况(这就是为什么我从不为我的属性定义ivars的原因。 ..我让@synthesize这样做。

  3. 我假设您没有为nameArray使用自定义设置器。我只是想确定一下。如果是这样,请分享一下。

  4. 最重要的是,您能否在nameArray @interface以及GameViewController声明中向我们展示对@synthesize的所有引用?