Objective c 目标C(iOS):准备工作赢得';我无法将数据传递到目标VC

Objective c 目标C(iOS):准备工作赢得';我无法将数据传递到目标VC,objective-c,ios,xcode,Objective C,Ios,Xcode,VC1=NewGameViewController VC2=GameViewController NewGameViewController.m - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if( [segue.identifier isEqualToString:@"newGameSegue"]) { GameViewController *gameVC = (GameViewContro

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*)名称数组fortextfieldArray:(NSArray*)带冒号的数组:(BOOL*)BOOL
基本上,如果给定一组文本字段,则返回一组字符串。withcolon是一个布尔值,表示您是否希望字符串的末尾附加一个冒号


当我调试我的代码时,gameVC中的_nameArrayIVAR在这里的每一行被调用后仍然读取nil…这里有人能帮我吗???

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

来访问GameViewController。我假设您在设置
gameVC.nameArray
之前已经完成了
数组的NSLog(或在调试器中检查)。你真的想确保它是按你认为的方式设置的。令人惊讶的是,我花了多少时间调试类似的东西,却发现问题出在我的等价物
nameArrayForTextFieldArray
中。或序列标识符名称中的键入错误。或者像这样的随机事件

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

  • 如何在
    GameViewController
    中定义您的
    nameArray
    属性?如果它不是
    引用(或
    副本
    ),则当
    数组
    超出范围时,它将被解除分配。我认为这会表现得稍有不同,但值得确认

  • 此外,我还见过像
    GameViewController
    这样的控制器可能会混淆各种IVAR和属性(这就是为什么我从不为属性定义IVAR…我让
    @synthesis
    这样做)

  • 我假设您没有为
    nameArray
    使用自定义setter。我只是想确定一下。如果是这样的话,也请分享一下


  • 一句话,您能否在您的
    GameViewController
    @界面
    以及它的
    @synthesis
    语句中向我们显示对
    nameArray
    的所有引用?

    当要执行从一个屏幕到另一个屏幕的切换时,UIKit将调用prepareForSegue方法。它允许我们在显示新的视图控制器之前将数据提供给它。通常,您可以通过设置其属性来实现这一点

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

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

    例如,如果我们想按
    ui按钮执行一个序列,我们可以这样做:

    MyViewController.h
    中,我们创建一个iAction(连接到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;
        }
    }
    

    对于这个sendData方法,您的意思是将它用作调用segue的按钮的iAction吗?是的,我使用了一个通用方法。其思想是为特定事件调用一个方法。按下按钮在单元格中单击,以此类推。