在presentViewController之后的模态视图中的nil委托。

时间:2015-10-27 12:52:58

标签: ios iphone delegates modalviewcontroller presentmodalviewcontroller

我在viewDidLoad中的第一个视图具有以下代码

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Dialpad" bundle:nil];
self.vc = [sb instantiateViewControllerWithIdentifier:@"DialpadBoard"];
self.vc.delegate = self;

头文件包含视图控制器的定义

@property (nonatomic, retain) DialpadTableViewController *vc;

捕获事件后,视图会加载新的模态视图

- (void)handleEvent:(UIGestureRecognizer*)recognizer {
    [self presentViewController:self.vc animated:YES completion:NULL];
}

该视图还包含关闭模态视图的方法:

- (void) dialpadControllerDidCancel:(SearchDialpadTableViewController *)controller {
     [self dismissViewControllerAnimated:YES completion:nil];
}

永远不会调用最后一个方法。

问题是加载时的模态视图有nil self.delegate。新的模态视图从故事板加载,如下所示。为什么代表是零?因为视图在另一个故事板中,所以我不知道如何 enter image description here

3 个答案:

答案 0 :(得分:0)

SearchDialpadTableViewController是否定义了委托协议,是否具有特定于该协议的属性?

该文件的标题应如下所示:

@protocol ViewControllerDelegateProtocol <NSObject>

- (void)dialpadControllerDidCancel:(SearchDialpadTableViewController *)controller;

@end

@interface ViewController : UIViewController

@property (weak, nonatomic) id<ViewControllerDelegateProtocol> searchPadDelegate;

@end

然后当用户点击Done时,我正在假设您正在尝试做什么(当发生这种情况时发送委托消息)。你会写类似

的东西
- (IBAction)donePressed:(id)sender
{
    if ([self.searchPadDelegate respondsToSelector:@selector(dialpadControllerDidCancel)]) {
        [self.searchPadDelegate dialpadControllerDidCancel:self];
}
}

答案 1 :(得分:0)

你可以试试这个

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Dialpad" bundle:nil]; 
UINavigationController *nav= [sb instantiateViewControllerWithIdentifier:@"DialpadBoard"];




((SearchDialpadTableViewController *)[nav viewControllers][0]).delegate = self; 
[self presentViewController:nav animated:YES completion:NULL];

由于我们有导航,因此请使用第一个控制器并分配代理

技巧;)

((SearchDialpadTableViewController *)[nav viewControllers][0]).delegate = self;

答案 2 :(得分:0)

你必须确定,self.vc是一个你期望的课程。它也可以是NavigationController