我的协议存在问题。
我的“初始视图控制器”是一个导航控制器。在根页面上,我展示了另一个导航控制器,其中嵌入了View Controller。 onclick一个segue应该被解雇...这完全有效但是“ViewController”中的委托方法永远不会被调用。
我添加的图像是一个示例,说明如何在iOS 5中使用InterfaceBuilder构建2个NavigationControllers之间的连接。
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];
}
我无法找到解决问题的方法。
我希望有人可以帮助我
谢谢你:)答案 0 :(得分:1)
我在这里看到了几个问题:
prepareForSegue
实施,因为在这种情况下segue.destinationViewController
指向UINavigationController
。因此,您需要获取该导航控制器对象,然后将setDelegate
发送到该导航控制器对象的rootViewController
。但是,只有当你决定保留那个导航控制器时才会这样。MyViewController
与ViewController
和PropertyController
课程的关系如何? PropertyController
类(或超类)需要具有@property
属性的synthesize
和delegate
语句。答案 1 :(得分:0)
我一直有同样的问题,为了使它工作,我找到了一个xcode并不喜欢的工作,但它仍然在工作 - &gt;设置您的委托,使您的导航控制器将您的视图作为委托,如果您在目标控制器中的NSLog self.delegate它将为null。为了防止这种情况,请执行 - >
self.delegate = self.navigationController.delegate;
在目标控制器(viewdidload)中,它将获得您在导航控制器上创建的委派,并允许您在目标控制器中使用它
它很脏,但这是我找到的唯一方法。希望它有所帮助。