Ios 如何修改属于源代码视图控制器的NSMutableArray元素?

Ios 如何修改属于源代码视图控制器的NSMutableArray元素?,ios,objective-c,uiviewcontroller,Ios,Objective C,Uiviewcontroller,我们正在尝试更新一个TableView,它使用NSMutableArray作为数据源。 我们有3个视图控制器:周>周>日 应用程序流程很简单: 周清单 周详细信息,包括日期列表 日细节 在(2)WeekViewController.h中,我们声明daysArray // file: WeekViewController.h @interface WeekViewController : UIViewController @property (weak, nonatomic) IBOutlet

我们正在尝试更新一个TableView,它使用NSMutableArray作为数据源。 我们有3个视图控制器:周>周>日

应用程序流程很简单:

  • 周清单
  • 周详细信息,包括日期列表
  • 日细节
  • 在(2)WeekViewController.h中,我们声明daysArray

    // file: WeekViewController.h
    @interface WeekViewController : UIViewController
    @property (weak, nonatomic) IBOutlet UILabel *firstDayLabel;
    @property (strong, nonatomic) NSMutableArray *daysArray;
    @property (strong, nonatomic) IBOutlet UITableView *daysTableView;
    @end
    
    在(3)DayViewController中,我们使用viewwilldefine方法更新属于源视图控制器的daysArray

    - (void)viewWillDisappear:(BOOL)animated
    {
      // currentVCIndex is the index of the parent view controller: WeekViewController
      int currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];
      // parent is the reference to the parent view controller: WeekViewController
      WeekViewController *parent = (WeekViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex];
      // indexPath is a reference to the Cell (in a TableView) that made the Segue to DayViewController
      NSIndexPath *indexPath = [parent.daysTableView indexPathForSelectedRow];
      // ### UPDATES simple UILabel on WeekViewController ###
      parent.firstDayLabel.text = @"new text'";
      // ### UPDATES the DAY OBJECT in an array on WeekViewController ###
      [parent.daysArray replaceObjectAtIndex:indexPath.row withObject:self.dayDetail];
      [parent.daysTableView reloadData];
    }
    
    最后一个会引发错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序。

    reason:
    '-[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object
    
    但如果我们只包括

    parent.firstDayLabel.text = @"new text'";
    
    WeekController上的标签已正确修改

    所以,我们不知道为什么不能替换NSMutableArray对象索引处的对象

    我们尝试了辅助对象和mutableCopy,但再次失败


    更新

    谢谢@sapi

    在代码的前几部分中,我们通过替换

    self.daysArray = responseObject;
    
    用这个

    self.daysArray = [NSMutableArray arrayWithArray:responseObject];
    

    parent
    上的
    daysArray
    属性很可能是从不可变数组初始化的,尽管很难从您发布的代码中确定

    你需要记住,如果你这样做:

    self.daysArray = [NSArray arrayWithObjects: @"Hi", @"Bye", nil];
    
    那么您刚才创建的数组将是不可变的,尽管
    daysArray
    的类型是
    NSMutableArray

    我建议您检查实际为
    daysArray
    提供值的代码,并确保实际为其提供了一个可变对象


    如果这确实是问题所在,那么修复起来就足够容易了。根据上面的示例,您可以执行以下操作:

    self.daysArray = [[NSArray arrayWithObjects: @"Hi", @"Bye", nil] mutableCopy];
    
    或者,或者:

    self.daysArray = [NSMutableArray arrayWithArray:[NSArray arrayWithObjects: @"Hi", @"Bye", nil]];
    

    (对于这个例子,这两种方法显然都是难以置信的精心设计。)

    显然
    daysArray
    不是可变数组。指针类型不确定对象类型。