Другой простой (и элегантный) способ - это создать некую связь между источником данных табличного представления, которым обычно является UIViewController, который содержит таблицу, и подробным представлением: это можно сделать с помощью шаблона Delegate, типичного для Cocoa.фреймворк.В этом случае вы можете определить протокол DetailViewDataDelegate только двумя методами:
-(id)nextTableObjectFrom:(id)referenceObject;
-(id)prevTableObject;(id)referenceObject;
, где referenceObject - это вызывающий объект, то есть объект, подробно описанный в DetailView.Поэтому DetailView будет определен следующим образом:
@interface DetailViewController:UIViewController {
}
@property (nonatomic,assign) id currentDetailedObject;
@property (nonatomic,assign) id dataDelegate;
и, конечно, когда вы вызываете контроллер, типичный для tableView: didSelectElementWithIndexPath: animated: метод, вы будете делать что-то вроде этого:
DetailViewController *dv = [[[DetailViewController alloc] initWithNibName:nil bundle:nil] autorelease];
dv.dataDelegate=self;
dv.currentDetailedObject=[mySourceArray objectAtIndexPath:indexPath.row];
[self.navigationController pushViewController:dv animated:YES];
Наконец, в DetailViewController, когда вам понадобится следующий (или предыдущий) элемент из таблицы, вы просто вызовете:
-(IBAction)nextButtonPressed {
self.currentDetailedObject = [self.dataDelegate nextTableObjectFrom:self.currentDetailedObject];
}
Конечно, детали реализации могут измениться, и, в частности, методы делегата,быть реализованным в UIViewController таблицы, будет зависеть от структуры данных.Преимущество такого подхода, который может быть на первый взгляд сложным, довольно элегантен и позволяет избежать передачи объектов вдоль контроллеров, что часто является источником проблем с памятью.Кроме того, с помощью делегированного подхода вы можете реализовать любую сложную функцию (например, вы даже можете управлять объектами табличного представления непосредственно из DetailViewController, конечно, на свой страх и риск!)