Почему мой пользовательский делегат не работает? - PullRequest
0 голосов
/ 09 сентября 2011

Я пытаюсь создать делегат, который позволит мне передавать данные из дочернего контроллера представления в родительский. Я просматривал различные учебные пособия / вопросы в Интернете, но мой метод делегата не запускается.

Не могли бы вы взглянуть на мой код ниже и посмотреть, не пропустил ли я что-нибудь?

TownListViewController.h

@protocol TownListViewControllerDelegate;

@interface TownListViewController : UITableViewController <NSFetchedResultsControllerDelegate> {

    id <TownListViewControllerDelegate> delegate;

}

@property (nonatomic, assign) id <TownListViewControllerDelegate> delegate;

@end

@protocol TownListViewControllerDelegate
@optional

- (void)didSelectTown:(Town *)town;

@end

TownListViewController.m

@implementation TownListViewController

@synthesize delegate;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [delegate didSelectTown:(Town *)[self.fetchedResultsController objectAtIndexPath:indexPath]];
    [self.navigationController popViewControllerAnimated:YES];
}

@end

SearchViewController.h

@interface SearchViewController : UITableViewController <TownListViewControllerDelegate> {

...

}

SearchViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    TownListViewController * townViewController = [[TownListViewController alloc] initWithNibName:@"TownListViewController" bundle:nil];
    townViewController.delegate = self;
    [self.navigationController pushViewController:townViewController animated:YES];
}

- (void)didSelectTown:(Town *)town
{
    NSLog(@"didSelectTown fired");
    self.selectedTown = town;
}

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 09 сентября 2011

попытаться перезагрузить данные после установки делегата.Я думаю, что первый вызов reloadData таблицы происходит во время initWithNibName TownListViewController ... В любом случае вы можете опубликовать значение delegate для этого метода:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Бьюсь об заклад, ноль ...

Кстати, рекомендуется проверять, соответствует ли переменная delegate протоколу, попробуйте добавить эту строку в предположении, что метод является необязательным:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([delegate conformsToProtocol(TownListViewControllerDelegate)] && [delegate respondsToSelector:@selector(didSelectTown:objectAtIndexPath:)])
        [delegate didSelectTown:(Town *)[self.fetchedResultsController objectAtIndexPath:indexPath]];
    [self.navigationController popViewControllerAnimated:YES];
}
...