3

我的协议有问题。

我的“初始视图控制器”是一个导航控制器。在根页面上,我显示了另一个导航控制器,其中嵌入了视图控制器。onclick 一个 segue 应该被解雇......这工作得很好,但从“ViewController”的委托方法永远不会被调用。

我添加的图像是我如何在 iOS 5 中使用 InterfaceBuilder 建立 2 个 NavigationController 之间的连接的示例。

图片

MyViewController.h

@protocol MyProtocol <NSObject>

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

@end

@interface MyViewController : UIViewController <MyProtocol>

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

@end

我的视图控制器.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

视图控制器.h

#import "MyViewController.h"

@interface ViewController : UIViewController <MyProtocol>

视图控制器.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];
}

我找不到我的问题的解决方案。

我希望有人能帮助我

谢谢你 :)

4

2 回答 2

1

我在这里看到几个问题:

  1. 在您的故事板屏幕截图中,您有第二个导航控制器。您不需要将 PropertyController 嵌入导航控制器中。相反,让根视图控制器直接连接到 PropertyController。如果由于某种原因您确实需要该导航控制器,那么您需要更改prepareForSegue上面的实现,因为segue.destinationViewController在这种情况下指向UINavigationController. 因此,您需要获取该导航控制器对象,然后发送setDelegate到该rootViewController导航控制器对象。但同样,只有当您决定保留该导航控制器时。
  2. MyViewController与您的ViewController课程PropertyController有什么关系?类PropertyController(或超类)需要具有属性的@propertyandsynthesize语句delegate
于 2011-12-07T14:27:31.760 回答
0

我遇到了同样的问题,为了让它工作,我找到了一个 xcode 不太喜欢的工作,但它仍然可以工作--> 在你做的时候设置你的委托,让你的导航控制器有你的视图作为委托,如果您在目标控制器中使用 NSLog self.delegate,它将为空。为了防止这种情况发生-->

self.delegate = self.navigationController.delegate; 

在您的目标控制器(viewdidload)中,它将获得您在导航控制器上创建的委托,并允许您在目标控制器中使用它

它很脏,但这是我找到的唯一方法。希望能帮助到你。

于 2014-08-31T07:24:19.637 回答