0

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 ......有人可以帮我吗?

4

3 回答 3

7

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

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

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

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

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;
    }
}
于 2012-07-04T08:25:19.253 回答
0

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

于 2012-07-04T04:54:39.143 回答
0

我假设您array在设置gameVC.nameArray. 你真的想确保它按照你认为的方式设置。令人惊讶的是,我花了多少次调试这样的东西才意识到问题出在我的等价于nameArrayForTextFieldArray. 或 segue 标识符名称中的拼写错误。或诸如此类的随机事情。

假设没问题,那么有几件事是可能的:

  1. 您的nameArray财产是如何定义的GameViewController?如果它不是strong引用(或 a copy),那么当您array超出范围时,它将被释放。我认为这会略有不同,但值得确认。

  2. 此外,我还看到过这样的情况,控制器GameViewController可能会在各种 ivars 和属性之间产生一些混淆(这就是为什么我从不为我的属性定义 ivars ......我让它@synthesize这样做)。

  3. 我假设您没有为nameArray. 我只是想确定一下。但是,如果是这样,请也分享一下。

最重要的是,您能否向我们展示nameArray@interface的 ofGameViewController及其@synthesize声明中的所有引用?

于 2012-07-04T05:08:18.887 回答