Вы должны устанавливать источник данных только один раз, и он не должен быть NSArray. Контейнер данных, из которого вы извлекаете свои записи, может измениться, но источник данных всегда должен быть одинаковым. В большинстве случаев источником данных должен быть только ваш контроллер представления. Тогда ваш контроллер представления должен реализовать методы в UITableViewDataSource протоколе , включая:
– tableView:cellForRowAtIndexPath: required method
– numberOfSectionsInTableView:
– tableView:numberOfRowsInSection: required method
– sectionIndexTitlesForTableView:
– tableView:sectionForSectionIndexTitle:atIndex:
– tableView:titleForHeaderInSection:
– tableView:titleForFooterInSection:
NSArray не отвечает ни на один из этих методов, поэтому вы получаете нераспознанное сообщение селектора. Вы должны реализовать их самостоятельно.
Вы должны ознакомиться с Руководством по программированию табличного представления , чтобы понять, как эффективно использовать представления таблицы.
С уважением.
ОБНОВЛЕНИЕ: Вот небольшой код, который может вам помочь. В вашем RootViewController создайте экземпляр NSArray с помощью alloc / init в -viewDidLoad. Назовите это элементами:
- (void)viewDidLoad;
{
[super viewDidLoad];
items = [[NSArray alloc] init];
}
Затем реализуйте делегаты источника данных вашего табличного представления следующим образом:
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
return [items count];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
{
return 1;
}
Тогда вам нужно реализовать свой cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell;
cell = [tv dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"] autorelease];
}
// Get your item from the items array here
NSDictionary *item = [items objectAtIndex:[indexPath row]];
NSString *text = [item valueForKey:@"text"];
[[cell textLabel] setText:text];
return cell;
}
Этот код предполагает, что объекты в вашем NSArray являются NSDictionaries. Если вы используете какой-либо пользовательский объект, приведите объект по указанному пути индекса к вашему пользовательскому типу, а затем используйте его поля.
Когда у вас появятся новые данные и вам потребуется перезагрузить табличное представление, вы просто перераспределите свои элементы NSArray и затем вызовете reloadData для табличного представления. Скажем, у вас произошла перезагрузка:
- (void)didReciveNewData:(NSArray*)newItems;
{
if (items) [items release], items = nil;
items = [newItems copy];
[tableView reloadData];
}
Это заставит табличное представление запросить свой контроллер представления о количестве отображаемых строк и о ячейках для каждой строки снова, которые предоставляются путем доступа к количеству и содержимому NSArray.
НТН.