我们正在尝试更新使用NSMutableArray作为数据源的TableView。 我们有3个View Controllers:Weeks>周>天
应用流程很简单:
在(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];
答案 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]];
(对于这个例子,这两者显然都是非常狡猾的。)