Передача значений между мастером и деталями в UISplitViewController с использованием раскадровок

Я определил протокол в файле Customer.h, который показан ниже:

<code>@class Customer; 
@protocol CustomerDelegate <NSObject>

-(void) didSelectCustomer:(Customer *) customer; 

@end

@interface Customer : NSObject
{

}

@property (nonatomic,copy) NSString *name; 
@property (nonatomic,copy) NSString *occupation; 

@end
</code>

MasterViewController (левая сторона) вызывает метод didSelectCustomer, как показано ниже:

<code>- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    Customer *selectedCustomer = [customers objectAtIndex:[indexPath row]];
    [self.delegate didSelectCustomer:selectedCustomer]; 
}
</code>

Теперь мне нужно сказать DetailViewController (справа) что-то сделать. DetailViewController соответствует протоколу CustomerDelegate.

<code>@interface DetailViewController : UIViewController<UISplitViewControllerDelegate,CustomerDelegate>
{

}

-(void) didSelectCustomer:(Customer *)customer
{
    NSLog(@"sssdasdasdasd");
}
</code>

Метод didSelectCustomer никогда не вызывается. Я думаю, что мне нужно установить masterViewController.delegate = self, но я не уверен, где настроить эту вещь.

UPDATE 1:

Я добавил экземпляр MasterViewController внутри DetailViewController, но он не работал:

<code>- (void)viewDidLoad
{
    [super viewDidLoad];    

    MasterViewController *master = [[MasterViewController alloc] init];
    master.delegate = self; 
}
</code>

SOLUTION:

В AppDelegate:

<code>  else 
    {
        UISplitViewController *splitViewController = (UISplitViewController *) self.window.rootViewController; 
        splitViewController.delegate = [splitViewController.viewControllers lastObject];



        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
       // splitViewController.delegate = (id)navigationController.topViewController;




        DetailViewController *detail =(DetailViewController *) [splitViewController.viewControllers lastObject];

        UINavigationController *masterNavigationController = [splitViewController.viewControllers objectAtIndex:0];

        MasterViewController *master = (MasterViewController *)masterNavigationController.topViewController;

        master.delegate = detail; 
    }
</code>
 GenieWanted16 сент. 2013 г., 15:24
Вы исправили проблему? Это ест мой мозг. Пожалуйста, дайте мне знать, если вы нашли исправление?

Ответы на вопрос(2)

последний объект контроллера разделенного вида.

этот объект возвращает контроллер навигации пользовательского интерфейса.

знаете, тогда вы можете сделать сами.

Вы никогда явно не объявляете себя делегатом класса Consumer. Простое соответствие этому не приведет к сокращению. Объявите это в -viewDidLoad, создав экземпляр Consumer, возможно, так:

-(void)viewDidLoad {
    Consumer *consumer = [[Consumer alloc]init];
    [consumer setDelegate:self];
}

Вы также не объявляете свойство для своего объекта делегата в Consumer, поэтому к нему никогда нельзя получить доступ. Сделайте это первым:

@class Customer; 
@protocol CustomerDelegate <NSObject>

-(void) didSelectCustomer:(Customer *) customer; 

@end

@interface Customer : NSObject
{

}

@property (nonatomic,copy) NSString *name; 
@property (nonatomic,copy) NSString *occupation; 
@property (weak) id <CustomerDelegate> delegate; //use assign or __unsafe_unretained if targeting <5.0.

@end

Вы можете проверить, соответствует ли ваш класс вашему протоколу следующим образом:

if (![delegate conformsToProtocol:@protocol(CustomerDelegate)]) {
    [NSException raise:@"Delegate Exception"
                format:@"Parameter does not conform to CustomerDelegate protocol at line %d", (int)__LINE__];
}
 04 апр. 2012 г., 23:42
Вы делаете это правильно. Вы просто никогда не назначали делегата, поэтому это никогда бы не сработало.
 azamsharp04 апр. 2012 г., 23:49
Я уже попробовал это, и это не сработало. Я использую UISplitViewController. Смотрите ОБНОВЛЕНИЕ 1
 azamsharp04 апр. 2012 г., 23:44
Мой делегат находится в файле MasterViewController. Поэтому из DetailViewController должно быть что-то _masterViewController.delegate = self; Но это не работает.
 04 апр. 2012 г., 23:45
Вам нужен экземпляр MasterViewController.
 azamsharp04 апр. 2012 г., 23:39
Но тогда как мне вызвать делегат didSelectCustomer из метода didSelectRowAtIndexPath.

Ваш ответ на вопрос