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

nil delegate in modal view after presentViewController.

我在 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];
}

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

问题是模态视图加载时没有self.delegate。新的模态视图从故事板中加载,如下所示。为什么代表是零?由于该视图在另一个情节提要中,因此我无法进行转场。

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

该文件的 header 应该类似于:

@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];
}
}

你可以试试这个

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;

您必须确定 self.vc 是您预期的 class。也可以是 NavigationController