2015-05-29 1 views
0

Я работал над примером tableview из учебника Nutting, Olsson и Mark iOS7. У меня хорошо работает табличное представление, поэтому я добавил кнопку к моему представлению. Когда я касаюсь внутри кнопки, он вызывает метод addData. addData просто добавляет другой объект в массив, который отображается в таблице.Ошибки Изменение данных в TableView Objective C

Код компилируется отлично, но когда я нажимаю кнопку, он падает. Почему это? Я не понимаю сообщение об ошибке, но вот код.

#import "ViewController.h" 
@interface ViewController() 
@property (copy, nonatomic) NSMutableArray* dwarves; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
self.dwarves = @[@1.5,@2.,@2.5,@3.,@3.5,@4.,@4.5,@5.,@5.5,@6.,@6.5,@7.]; 
UITableView *tableView = (id)[self.view viewWithTag:1]; 
UIEdgeInsets contentInset = tableView.contentInset; 
contentInset.top = 20; 
[tableView setContentInset:contentInset]; 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
return [self.dwarves count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: 
         SimpleTableIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] 
      initWithStyle:UITableViewCellStyleDefault 
      reuseIdentifier:SimpleTableIdentifier]; 
} 
cell.textLabel.text = [NSString stringWithFormat:@"%@",self.dwarves[indexPath.row]]; 
return cell; 
} 

- (IBAction)addData:(id)sender { 
[_dwarves addObject:@100]; 
} 
@end 

Вот ошибка:

2015-05-28 18:37:24.449 TableView Practice[3630:145774] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7924aa40 
2015-05-28 18:37:24.453 TableView Practice[3630:145774] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x7924aa40' 

Что случилось с этим кодом?

+0

Вы должны были получить предупреждение при создании карликов, так как вы создаете неизменяемый массив, когда вы ввели его как изменяемый. Разве у вас не появился желтый желтый треугольник? – rdelmar

+0

Нет, я этого не делал, но решение gnasher отлично работало! –

ответ

0

Независимо от того, как вы заявили о создании гномов, это NSArray, а не NSMutableArray. Поэтому addObject аварийно завершает работу. Я считаю, что сочетание свойства «copy» и изменчивого типа не делает того, что вы думаете, что ему следует делать.

Лучше сделать «карлик» просто нормальную «сильной» собственность, но инициализирует

self.dwarves = [@[@1.5,@2.,@2.5,@3.,@3.5,@4.,@4.5,@5.,@5.5,@6.,@6.5,@7.] mutableCopy]; 
+0

Большое спасибо! Он работает сейчас! Если я хотел бы перезагрузить представление таблицы, когда я вызываю addData, чтобы он отображал 100, как бы я это сделал? –

0

использовать следующий код для установки вашего массива, а затем вы можете добавить/удалить объекты из него.

[[NSMutableArray alloc] initWithArray:@[@1.5,@2.,@2.5,@3.,@3.5,@4.,@4.5,@5.,@5.5,@6.,@6.5,@7.]];

0

self.dwarves = @[@1.5,@2.,@2.5,@3.,@3.5,@4.,@4.5,@5.,@5.5,@6.,@6.5,@7.];

Вы пропускание NSArray и неизменно:

self.dwarves = [@[@1.5,@2.,@2.5,@3.,@3.5,@4.,@4.5,@5.,@5.5,@6.,@6.5,@7.] mutableCopy]; 
//or 
self.dwarves = [[NSMutableArray alloc] initWithArray:@[@1.5,@2.,@2.5,@3.,@3.5,@4.,@4.5,@5.,@5.5,@6.,@6.5,@7.]]; 

позволит вам изменить/обновить/изменить значение в вашем NSMutableArray.

После делает его изменчивым вам нужно:

- (IBAction)addData:(id)sender 
{ 
     [_dwarves addObject:@100]; 

     UITableView *tableView = (id)[self.view viewWithTag:1]; 
     [tableView reloadData]; 
     // or 
     [(UITableView *)[self.view viewWithTag:1] reloadData]; 
     // to see the changes you made after adding data to your dataSource 
}