2015-05-11 2 views
1

У меня есть код Obj-c, который работает нормально, но мне интересно, использует ли он «анти-шаблон», и если есть очевидный лучший маршрут, который может принять более опытный человек.Отправка делегата через Segue - плохой шаблон?

  • ViewController1 выступает в роли делегата для объекта, созданного из сторонней библиотеки. Это на переднем плане.
  • ViewController2 выходит на передний план. Во время segue в prepareForSegue ViewController1 устанавливает делегат объекта, который он в настоящее время выполняет функции делегата для ViewController2, так что любые последующие вызовы делегатов принимаются на ViewController2, когда он находится на переднем плане.

Это работает. И это меня не слишком беспокоит. Но ему нравится что-то, где может быть более идиоматическое решение.

ответ

0

Когда вы представляете/нажимаете ViewController1 в ViewController2, просто измените делегат вашего объекта на ViewController2. Просто как передающие переменные передают ваш делегат.

например: , если вы используете раскадровки SEGUE

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:SEGUE_IDENTIFIER]) { 
    ViewController2 *vc=(ViewController2 *)[segue destinationViewController]; 
    vc.OBJECT_IN_VIEWCONTROLLER1=OBJECT_IN_VIEWCONTROLLER2; 
    vc.OBJECT_IN_VIEWCONTROLLER2.delegate=vc; 
    } 
} 

Также установлен класс объекта и его методы делегата в ViewController2

0

Я не знаю, подходит ли он свое дело, но, как насчет сделать asuper который управляет материалом делегата для вас и делает ваш ViewController1 и ViewController2 подклассом? Я приведу вам пример с использованием псевдокода.

Ваш super_view_controller.m

- (void)viewWillAppear:(BOOL)animated { 

    [super viewWillAppear:animated]; 

    //your delegate stuff, supposing the 3rd party lib object is singleton 
    [[3PARTYOBJ sharedInstance] setDelegate:self]; 
} 

- (void)someDelegateMethod { 

    //common stuff 
} 

На данный момент, если ваш view_controller1 и view_controller2 наследует от super_view_controller класса, вы dont't нужно беспокоиться о смене владельца делегата, это будет происходить автоматически ... и если вам нужно сделать отдельный материал на view_controller1 или 2, просто переопределить метод делегата:

view_controller1.m (super_view_controller подкласс)

- (void)someDelegateMethod { 

    //if you need common stuff, call super 
    //[super someDelegateMethod]; 

    //or do your view_controller1 stuff here 
} 

(вам не нужно переопределять метод делегирования на view_controller2, если это не необходимо. Вместо этого будет называться метод super)

Смежные вопросы