2012-05-31 4 views
0

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

В popoverViewController.h

#import <UIKit/UIKit.h> 


@protocol MyPopoverDelegate <NSObject> 
-(void) didSelectLanguage; 
@end 



@interface Popover : UITableViewController{ 

    id <MyPopoverDelegate> delegate; 
    NSMutableArray *languageData; 

} 

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

@end 

@synthesize delegate; 

... 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"You selected %@", [languageData objectAtIndex:[indexPath row]]); 
    [self.delegate didSelectLanguage]; 

} 

... 

И в ViewController, который представляет поповер

#import <UIKit/UIKit.h> 
#import "popoverViewController.h" 




@interface ChoicesChoices : UIViewController <UIPopoverControllerDelegate, MyPopoverDelegate>{ 

    UIPopoverController *popover; 




} 
- (IBAction)facebook:(id)sender; 
- (IBAction)twitter:(id)sender; 
- (IBAction)sms:(id)sender; 
- (IBAction)copy:(id)sender; 
- (IBAction)email:(id)sender; 
- (IBAction)home:(id)sender; 
- (IBAction)mute:(id)sender; 
- (IBAction)note:(id)sender; 


@property (nonatomic, retain) UIPopoverController* popover; 


@end 

и .m

@synthesize popover; 

... 

- (void)didSelectLanguage{ 
[popover dismissPopoverAnimated:YES]; 
NSLog(@"didSelectLanguage fired"); 
} 

Когда я выбираю строку в таблице popover, didSelectLanguage не вызывается. Любые идеи о том, что я могу делать неправильно? Спасибо за вашу помощь.

+1

Вы уверены, что делегат не 'nil'? Другими словами, поскольку вы не показываете код, я должен спросить, действительно ли вы делегировали делегат как экземпляр вашего контроллера 'ChoicesChoices'? – gschandler

+0

Я не уверен. Как это будет выглядеть? Пойдет ли это? – davis

+0

См. Ниже пример – gschandler

ответ

1

Убедитесь, что вы устанавливаете свой делегат в качестве контроллера вида, который представляет ваш popover. Что-то вроде этого в ChoicesChoices.m:

- (void)presentPopover 
{ 
    // assuming ARC for all allocations 
    Popover *myController = [Popover new]; 
    myController.delegate = self; 
    self.popover = [[UIPopoverController alloc] initWithContentViewController:myController]; 
    [self.popover presentPopover...]; // two flavors here, FromRect: and FromBarButtonItem:, that's left up to you to choose which one is correct. 
} 
+0

Удивительный, вот и все. – davis

1

Убедитесь, что вы установите делегат в представлении контроллера представления при создании экземпляра вашего пользовательского класса.

popover.delegate = self 

Кроме того, похоже, что ваша собственность является стандартным контроллером popover вместо экземпляра вашего настраиваемого контроллера представлений.

+0

Собственно, его свойство 'popover' имеет смысл. Это не означает, что речь идет о контроллере представления, который содержит popover, но сам popover. Таким образом, ваш 'popover.delegate = self;' находится в правильном направлении, неправильный объект. – gschandler