Делегат не работает, при использовании модального представленного NavigationController (iOS 5 - Раскадровка) - PullRequest
3 голосов
/ 07 декабря 2011

У меня проблема с протоколом.

Мой "начальный контроллер просмотра" - это контроллер навигации.На корневой странице я показываю другой контроллер навигации, в который встроен View Controller.onclick следует запустить segue ... это работает отлично, но метод делегата из "ViewController" никогда не вызывается.

Изображение, которое я добавил, является примером того, как я строю соединение между двумя NavigationController с помощью InterfaceBuilderв iOS 5.

image

MyViewController.h

@protocol MyProtocol <NSObject>

@required
- (void) myFunction:(NSString *)string;

@end

@interface MyViewController : UIViewController <MyProtocol>

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

@end

MyViewController.m

#import "MyViewController.h"
@implementation PropertyController
@synthesize delegate = _delegate;

- (void) myFunction:(NSString *)string {
    [_delegate myFunction:string];
}

- (IBAction) callDelegate:(id)sender {
     ![enter image description here][1][self myFunction:@"test"];
}

И это код дляViewController, который показывает NavigationController сверху

ViewController.h

#import "MyViewController.h"

@interface ViewController : UIViewController <MyProtocol>

ViewController.m

#import "ViewController.h"

@implementation ViewController

- (void) myFunction:(NSString *)string {
    NSLog(@"myFunction was called");
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    [((MyViewController *) segue.destinationViewController) setDelegate:self];
}

- (IBAction) showModalNavigationController {
    [self performSegueWithIdentifier:@"NameFromSegueInInterfaceBuilder" sender:self];
}

Я не могу найти решение для своей проблемы.

Я надеюсь, что кто-нибудь может мне помочь

спасибо:)

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Я вижу здесь несколько проблем:

  1. На вашем скриншоте у вас есть второй контроллер навигации.Вам не нужно вставлять свой PropertyController в контроллер навигации.Вместо этого имейте корневой контроллер представления непосредственно в PropertyController.Если по какой-то причине вам нужен этот навигационный контроллер, вам нужно будет изменить реализацию prepareForSegue, указанную выше, поскольку segue.destinationViewController в этом случае указывает на UINavigationController.Таким образом, вам нужно получить этот объект контроллера Nav, а затем отправить setDelegate на rootViewController этого объекта контроллера Nav.Но опять же, только если вы решите сохранить этот навигационный контроллер.
  2. Как MyViewController относится к вашим ViewController и PropertyController классам?Класс PropertyController (или суперкласс) должен иметь операторы @property и synthesize для свойства delegate.
0 голосов
/ 31 августа 2014

У меня возникла та же проблема, чтобы заставить ее работать, я нашел работу, которая не очень нравится xcode, но она все еще работает, хотя -> установка вашего делегата, как вы это делаете, делает ваш контроллер навигации если вы используете NSLog self.delegate в вашем контроллере назначения, он будет иметь значение null. Чтобы предотвратить это, сделайте ->

self.delegate = self.navigationController.delegate; 

в контроллере назначения (viewdidload), он получит делегирование, которое вы создали на навигационном контроллере, и позволит вам использовать его в контроллере назначения

Это грязно, но это единственный способ, который я нашел. Надеюсь, это поможет.

...