Как сделать UIViewController делегатом для отдельного UITableViewController? - PullRequest
1 голос
/ 16 февраля 2011

У меня есть UITabBarController, который имеет на одной из своих вкладок UINavigationController.Затем UINavigationController имеет пользовательский UIViewController в качестве основного вида.

На основе IBAction, вызванного кнопкой в ​​пользовательском UIViewController, я помещаю контроллер UITableView в стек UINavigationController следующим образом.(Примечание: это только фрагменты фактического кода).

Заголовочный файл для основного UIViewController:

@interface ATMs : UIViewController <CLLocationManagerDelegate, NSFetchedResultsControllerDelegate, MKMapViewDelegate> {
}
- (IBAction) showLocationList;
@end  

Файл реализации для основного UIViewController:

@implementation ATMs
- (void)showLocationList {

    LocationList *locationTableController = [[LocationList alloc] initWithNibName:@"LocationList" bundle:nil];

    [self.navigationController pushViewController:locationTableController animated:YES];
    [locationTableController release];

}

locationTableController контроллер представления выполняет выборку в Core Data для получения списка объектов и отображает их в таблице.Когда пользователь выбирает строку, я хочу, чтобы произошли следующие вещи:

  • выдвиньте locationTableController из контроллера навигации, чтобы мой ATMs контроллер представления был виден
  • callметод в ATMs, передавая объект, представленный строкой, нажатой в locationTableController

Я попытался сделать это, используя [locationTableController setDelegate:self]; в showLocationList прямо под тем, где I alloc UITableViewController и добавление UITableViewDelegate в заголовок для ATMs.
Но когда я делаю выше, я получаю ошибку сборки, говорящую, что locationTableController может не отвечать на setDelegate.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Проще говоря, без проверки остальной части вашего кода, вам нужно создать экземпляр UITableViewController и установить его делегат tableView (не TableViewController) как self.

Затем вы можете реализовать - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath в своем ATM UIViewController, и он будет вызываться после выбора строки в вашем tableView.

Я бы также представил ваш tableViewController модально согласно приведенному ниже коду и объявил бы его как переменную экземпляра, чтобы вы могли отклонить его при вызове метода делегата tableview:

@class LocationList
@interface ATMs : UIViewController
{
   LocationList *locationTableController
   ...
}

А в твоей реализации:

@implementation ATMs
...
- (void)showLocationList 
{
    locationTableController = [[LocationList alloc] initWithNibName:@"LocationList" bundle:nil];
    locationTableController.tableView.delegate = self;
    [self presentModalViewController:locationTableContrller animated:YES];
    [locationTableController release];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [locationTableController dismissModalViewControllerAnimated:YES];
    // Rest of your implementation code here
}
0 голосов
/ 16 февраля 2011

Это может быть достигнуто различными подходами, такими как: -

  1. Шаблон делегирования
  2. Уведомления
  3. Используя методы класса (getter / setters), в контроллере ATM, в другом классе менеджера
  4. Наблюдения ключевых значений.

но я думаю, что лучшим подходом было бы создание собственного метода делегата и отправка обратного вызова при выборе строки в LocationList вместе с данными, которые вы хотите на контроллере ATM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...