2012-04-04 6 views
4

Ich habe das Protokoll in Customer.h Datei definiert, die unten gezeigt wird:Passing Werte zwischen Master- und Detail in UISplitViewController Storyboards Mit

@class Customer; 
@protocol CustomerDelegate <NSObject> 

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

@end 

@interface Customer : NSObject 
{ 

} 

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

@end 

Die MasterViewController (linke Seite) ruft die didSelectCustomer Verfahren wie unten gezeigt:

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

Jetzt muss ich den DetailViewController (rechte Seite) etwas tun. Der DetailViewController entspricht dem CustomerDelegate-Protokoll.

@interface DetailViewController : UIViewController<UISplitViewControllerDelegate,CustomerDelegate> 
{ 

} 

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

Die didSelectCustomer-Methode wird nie aufgerufen. Ich denke, dass ich den masterViewController.delegate = selbst einstellen muss, aber ich bin nicht sicher, wo man dieses Ding aufstellt.

UPDATE 1:

Ich fügte hinzu, die Instanz von MasterViewController im Inneren des DetailViewController aber es hat nicht funktioniert:

- (void)viewDidLoad 
{ 
    [super viewDidLoad];  

    MasterViewController *master = [[MasterViewController alloc] init]; 
    master.delegate = self; 
} 

LÖSUNG:

In AppDelegate:

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; 
    } 
+0

Haben Sie das Problem behoben? Das frisst mein Gehirn. Bitte lassen Sie mich wissen, wenn Sie den Fix gefunden haben? – GenieWanted

Antwort

0

Sie deklarieren sich niemals explizit als Delegierter für die Consumer-Klasse. Lediglich damit konform zu sein, wird es nicht schneiden. Erklären Sie es in -viewDidLoad durch eine Instanz von Consumer zu schaffen, möglicherweise wie folgt aus:

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

Sie auch keine Eigenschaft für Ihren Delegatobjekt in Consumer erklären, so kann es eigentlich nie zugegriffen werden. Tun Sie dies zuerst:

@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 

können Sie überprüfen, ob Ihre Klasse zu Ihrem Protokoll entspricht in etwa so:

if (![delegate conformsToProtocol:@protocol(CustomerDelegate)]) { 
    [NSException raise:@"Delegate Exception" 
       format:@"Parameter does not conform to CustomerDelegate protocol at line %d", (int)__LINE__]; 
} 
+0

Aber wie kann ich den didSelectCustomer-Delegaten über die Methode didSelectRowAtIndexPath aufrufen? – azamsharp

+0

Du machst das richtig. Sie haben nie einen Delegierten zugewiesen, also hätte es nie funktioniert. – CodaFi

+0

Mein Stellvertreter befindet sich in der MasterViewController-Datei. Also sollte von DetailViewController etwas _masterViewController.delegate = self sein; Aber es funktioniert nicht. – azamsharp

0

die Split-View-Controller das letzte Objekt.

Dieses Objekt gibt einen UI-Navigationscontroller zurück.

Sie wissen, dann können Sie selbst tun.

Verwandte Themen