【问题标题】:NSMutableArray always initiates on loadNSMutableArray 总是在加载时启动
【发布时间】:2014-06-07 02:51:45
【问题描述】:

我已经在 viewcontroller.h 中声明了一个数组:

@property (nonatomic, strong) NSMutableArray *array;

在 viewcontroller.m 中,我将这段代码放在了控制器的实现中:

@synthesize array = _array;

在 viewDidLoad-method 的开头我有这个:

if (_array == nil){
    NSLog(@"arr was null");
    _array = [[NSMutableArray alloc] init];
}

在上面的代码之后,我以这种方式将一个对象添加到可变数组中:

[_array addObject:@"1"];

但是,当我在模拟器中从一个控制器转到另一个控制器时,_array 始终为 nil,它从头开始分配数组,所有旧值都消失了。我做错了什么?

更新: 我没有使用任何导航控制器。我使用模态推送。在 ctrl2 中,我覆盖了方法 prepareForSegue 放置了这个相关代码:

ViewController1 *ctrl1 = segue.destinationViewController;
ctrl1.anothervar = 3;

到 ctrl1 的真正“重定向”是在 ctrl2 的方法“tableView”中完成的(当用户选择一个选项时)。代码如下所示: [self performSegueWithIdentifier:@"select_game_to_ctrl1" sender:self];

ctrl1 已被赋予标识符“select_game_to_ctrl1”(通过情节提要)

【问题讨论】:

  • 请提供更多信息,了解从一个控制器到另一个控制器的含义。另外,粘贴您的 viewDidLoad 方法,以便我们查看它是否有任何问题。
  • 那你在做什么?
  • 对不起。我删除了评论。我在情节提要中有控制器 1 和控制器 2。在 performSegueWithIdentifier 的帮助下,单击 controller1 上的按钮将我带到 ctrl2。 Ctrl1 是第一个视图。在viewDidLoad中,我第一次去这个控制器时,应该初始化数组。然后是带我到 ctrl2 的按钮。从那里我用 performSegueWithIdentifier 返回到 ctrl1。我还在 ctrl2 中使用 prepareForSegue。所以我终于回到 ctrl1 并在 viewDidLoad 中再次初始化数组。
  • 等一下为什么你在回来时使用“从那里我用 performSegueWithIdentifier 回到 ctrl1” performSegueWithIdentifier,因为它已经由 iOS 管理
  • iEinstein 我不明白你的问题。在 ctrl2 中有一个带有选项的表。我需要在 ctrl2 中了解选择了哪个选项,然后使用 ctrl1 的实例在 ctrl1 中设置(另一个)变量。使用这个有错吗?我不明白。

标签: ios objective-c initialization nsmutablearray


【解决方案1】:

您的问题在于您的导航方式。

如果您从 VC Ctrl1 转到 ctrl2 并使用 segue,则不应通过另一个正常 segue 从 ctrl2 返回 Ctrl1。这样做是创建一个新的 Ctrl1 空白实例并将其添加到您的其他视图控制器之上。由于您创建了 Ctrl1 的新实例,它的 viewDidLoad 方法被调用,并创建了一个新的、不同的数组。 Ctrl1 的另一个副本仍然存在,由 ctrl2 和您刚刚创建的 Ctrl1 的新实例覆盖。

如何修复它取决于您使用的 segue 类型。如果您使用 push segue(由导航控制器管理)从 Ctrl1 转到 ctrl2,则应设置从 ctrl2 返回到 ctrl1 作为弹出。

如果您通过 presentModalViewController 调用从 Ctrl1 转到 ctrl2,那么您想使用 dismissViewControllerAnimated:completion: 返回。

第三个选项是设置一个 unwind segue,但是当您只是直接返回到您刚刚来自的视图控制器时,这并不是真正需要/不合适的。

如果您需要更多帮助,请告诉我们您使用哪种类型的 segue 从 Ctrl1 到 ctrl2,并从 Ctrl1 发布您的 prepareForSegue 方法。

编辑:您的问题的解决方案在上面以粗体显示。

【讨论】:

  • 好的,但我不会使用 presentModalViewController 从 ctrl1 转到 ctrl2。我使用 performSegueWithIdentifier 从 ctrl1 到 ctrl2。所以你的意思是我需要更改ctrl1并使用presentModalViewController转到ctrl2?而当我在ctrl2时,我仍然需要在ctrl1中设置变量。那我不会有同样的问题吗?
  • 另外,我看到 presentModalViewController 已被弃用。这真的是要走的路吗?我想要的是从 1 到 2。然后当我进入 2 时,我想在 controller1 上设置一个变量并返回它。这样做的普通方法是什么?
  • 是的,presentModalViewController:animated: 在 2 个主要版本之前的 6.0.0 中已被弃用。 (很快将是 3 个主要版本 - 一旦 iOS 8 发布。)由于您没有拼出方法的全名,我错过了您命名已弃用的方法这一事实。您应该使用 presentViewController:animated:completion: 而不是 presentModalViewController。而相应的解除模态的新方法是dismissViewControllerAnimated:completion:
  • 如果您从 ctrl1 到 ctl2 使用模态 segue,系统会代表您调用 presentViewController:animated:completion:。撤消模态转场的方法是从您的按钮操作中调用dismissViewControllerAnimated:completion:
  • 我现在很生气。 您现在所做的绝对是错误的。你需要使用dismissViewControllerAnimated:completion: INSTEAD。 这次你听到我(以及其他所有告诉你的人)了吗?
猜你喜欢
  • 2015-03-28
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多