Я думаю, что лучший способ сделать это, вместо того, чтобы использовать три отдельных контроллеров, просто использовать один. Это один контроллер будет подкласс UIViewController
, и его файл .h
должен выглядеть примерно так:
@interface MyController : UIViewController <UITableViewDataSource, UITableViewDelegate>
UITableView *firstTableView;
UITableView *secondTableView;
@end
Теперь в файле .m
установите таблицы вверх, как так:
- (id)init {
if ((self = [super init])) {
firstTableView = [[UITableView alloc] initWithFrame:/*desired frame*/ style:/*desired style*/];
secondTableView = [[UITableView alloc] initWithFrame:/*desired frame*/ style:/*desired style*/];
firstTableView.delegate = self;
firstTableView.dataSource = self;
secondTableView.delegate = self;
secondTableView.dataSource = self;
}
}
- (void)dealloc {
[firstTableView release];
[secondTableView release];
[super dealloc];
}
Тогда, реализуют желаемое UITableViewDataSource
методов, например:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView == firstTableView) {
// Do something
} else if (tableView == secondTableView) {
// Do something else
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
if (tableView == firstTableView) {
// Configure the cell
} else if (tableView == secondTableView) {
// Configure the cell a different way
}
}
Наконец, в didSelectRowAtIndexPath
:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (tableView == firstTableView) {
// Update something that is linked to the return values of secondTableView's dataSource methods
[secondTableView reloadData];
}
}
Такой подход гарантирует, что ваш контроллер получает право -viewDidLoad
, -viewWillAppear
, и так далее, автоматически. Помните, что просто добавляет представления диспетчера вида, так как subviews означает, что ваш контроллер не получит эти вызовы.
Спасибо @vikingosegundo. какова разница между делегированием и уведомлением в этом случае, с точки зрения принципов программирования. Я думаю, что их принципы очень схожи, и пусть кто-то другой сделает это за них. – ThinkChris
Есть общие черты. Но большие различия также. Уведомления транслируют: они могут сообщать о многих объектах, которые «настроены» на объекте, но их отправитель не может получать из него никаких сообщений или объектов. Делегирование - это сообщение 1 к 1, но методы делегата могут возвращать объекты. Вы можете использовать методы с подписями любого типа. Передача уведомлений является дорогостоящей, а делегации - это просто обычная отправка сообщений. – vikingosegundo
http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html – vikingosegundo