Вызов метода протокола с множественной иерархией подпредставлений - PullRequest
2 голосов
/ 12 марта 2012

Я довольно новичок в Obj-C и изучаю использование протоколов и делегатов.

У меня нет проблем с приведением примеров для реализации протокола / передачи данных, когда есть только два представления, однако я получаю ошибку «нераспознанный селектор», когда пытаюсь вызвать метод, когда у меня есть несколько подпредставлений.

Например, в сценарии, где у меня есть

  • FirstViewController
  • SecondViewController
  • ThirdViewController

Я быкак ThirdViewController для обратного вызова FirstViewController.

Общий код будет выглядеть примерно так:

в FirstViewController.h

@interface FirstViewController : UIViewController <MyProtocol>

в firstViewController.m

//present a second controller which will control settings for the app
SecondViewController *secondViewController = [[SecondViewController alloc]     initWithNibName:@"secondViewController" bundle:nil];

secondViewController.delegate= self;

secondViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

[self presentModalViewController: secondViewController animated: YES];

и позже

-(void) aMethod{
    //carry out some action here
}

в secondViewController.m

//present a third controller...maybe a table view for selecting music   
ThirdViewController *thirdViewController = [[ThirdViewController alloc] initWithNibName:@"thirdViewController" bundle:nil];

thirdViewController.delegate= self;

thirdViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

[self presentModalViewController: thirdViewController animated: YES];

в ThirdViewContoller.h

//Create a protocol to implement options back on the firstViewController
@protocol MyProtocol;

@interface thirdViewController
{
    IBOutlet UIButton *aButton;
}

@property (nonatomic, weak) id<MyProtocol> delegate;
-(IBAction) callMethod:(id)sender;
@end

@protocol MyProtocol <NSObject>
- (void) aMethod;
@end

в ThirdViewController.m

@synthesize delegate;

-(IBAction) callMethod:(id)sender{
    [self.delegate aMethod];
}

При запуске кажется, что сообщение отправляется только в secondViewController, а не в firstViewController, потому что ошибка:

- [SecondViewController aMethod:]: нераспознанный selector отправлено в экземпляр 0x19d620

Я думаю, что есть какая-то фундаментальная концепция с настройкой точек делегатов, которые еще не изучены, или структура программы неверна.

Существует множество примеров кодаиспользуя только два представления, которые хорошо работают здесь, но я не нашел много информации о нескольких представлениях.Заранее извиняюсь, если мой дизайн программы действительно неправильный.

1 Ответ

1 голос
/ 12 марта 2012

Вам необходимо SecondViewController для соответствия вашему протоколу:

@interface SecondViewController : UIViewController <MyProtocol>

Вы пытаетесь вызвать метод на втором контроллере представления, который существует только в первом.Если вы хотите связаться с первым контроллером представления, вам нужно будет определить второй протокол, чтобы сделать это.

Это действительно хорошее академическое упражнение, чтобы узнать о возможностях и ограничениях протоколов, ноВы также должны заметить конфликт в именовании.Постарайтесь быть как можно более понятным при именовании протоколов.В идеале, вы должны иметь набор заголовочных файлов, которые выглядят так:

@interface FirstViewController : UIViewController <SecondViewControllerDelegate>
@end

И контроллер второго вида:

@protocol SecondViewControllerDelegate <NSObject> 
-(void)someSecondViewControllerDelegateMethod;
@end

@interface SecondViewController : UIViewController <ThirdViewControllerDelegate>

@protocol (nonatomic, weak) id <SecondViewControllerDelegate> delegate;

@end

И, наконец, контроллер третьего вида:

@protocol ThirdViewControllerDelegate <NSObject> 
-(void)someThirdViewControllerDelegateMethod;
@end

@interface ThirdViewController : UIViewController

@protocol (nonatomic, weak) id <ThirdViewControllerDelegate> delegate;

@end

Таким образом, контроллер второго представления может реализовывать -(void)someThirdViewControllerDelegateMethod, и он может выглядеть следующим образом:

-(void)someThirdViewControllerDelegateMethod
{
    [self.delegate someFirstViewControllerDelegateMethod];
}

И именно так контроллер третьего представления может обращаться к первому;это своего рода каскады и передает сообщение.

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