如何修改属于源View Controller的NSMutableArray元素?

时间:2014-10-08 00:25:27

标签: ios objective-c uiviewcontroller

我们正在尝试更新使用NSMutableArray作为数据源的TableView。 我们有3个View Controllers:Weeks>周>天

应用流程很简单:

  1. 周列表
  2. 周详细信息,包含天数列表
  3. 日间细节
  4. view app flow diagram

    在(2) ViewController.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) ViewController中,我们使用 viewWillDisappear 方法更新属于源视图控制器的daysArray中的Day

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

1 个答案:

答案 0 :(得分:0)

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

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

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]];

(对于这个例子,这两者显然都是非常狡猾的。)