Ios 如何修改属于源代码视图控制器的NSMutableArray元素?
我们正在尝试更新一个TableView,它使用NSMutableArray作为数据源。 我们有3个视图控制器:周>周>日 应用程序流程很简单: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
// 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
不是可变数组。指针类型不确定对象类型。