2014-10-08 47 views
-1

我们试图更新一个TableView,它使用一个NSMutableArray作为数据源。 我们得到了3视图控制器:周>周刊“日如何修改属于源视图控制器的NSMutableArray元素?

应用流程很简单:

  1. 周列表
  2. 周细节,与天的名单
  3. 日详细

view app flow diagram

(2)Week 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方法,该方法更新属于源视图控制器

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

这daysArray日最后一个抛出错误:终止应用程序,由于未捕获的异常'NSInternalInconsistencyException'

reason: 
'-[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object 

但是,如果我们仅仅包括

parent.firstDayLabel.text = @"new text'"; 

上WeekController的标签正确修改。

因此,我们不知道为什么我们不能替换该NSMutableArray对象的索引处的对象。

我们尝试过使用辅助对象和mutableCopy,并再次失败。


UPDATE

感谢@sapi,

我们在代码前面的部分解决了这个,用这个

self.daysArray = [NSMutableArray arrayWithArray:responseObject]; 
+0

显然'daysArray'是不是一个可变数组。指针类型不确定对象类型。 – 2014-10-08 00:34:27

回答

0

的更换

self.daysArray = responseObject; 

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

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

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

那么你刚刚创建的阵列将是不变的,尽管daysArrayNSMutableArray类型。

我建议你检查你实际给daysArray赋值的代码,并确保你实际上给它一个可变对象。


如果这实际上是问题,那么修复起来很容易。从上面的例子中继,你可以这样做:

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

,或者:

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

(这两项都显得这个例子令人难以置信的做作。)

相关问题