【问题标题】:nil delegate in modal view after presentViewController.在 presentViewController 之后的模态视图中的 nil 委托。
【发布时间】:2015-10-27 12:52:58
【问题描述】:

我在 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。新的模态视图从情节提要加载,如下所示。为什么代表是零?由于视图位于另一个故事板中,所以我无法进行转场。

【问题讨论】:

  • 你在第一个视图控制器中实现了“dismiss”方法吗?
  • 是的,它被实现了,但是它永远不会被调用,因为第二个视图控制器有 self.delegate nil。
  • 如果你只是实现这个方法来关闭第二个视图,你可以选择更简单的方法,在第二个视图中插入 uibutton 并作为关闭按钮
  • 但是如果你想在某些事件之后关闭第二个视图,你需要在第二个视图中定义一个委托协议来调用你的方法
  • 我已经做到了。我的问题是第二个视图没有第一个视图的地址(self.delegate 为 nil),这是我的主要问题

标签: ios iphone delegates modalviewcontroller presentmodalviewcontroller


【解决方案1】:

你可以试试这个

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】:

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

    【讨论】:

    • 一切如你所描述,不同的是,delegate不是弱而是强,因为项目不使用ARC。
    • 我的 donePressed 方法包含 [self.delegate dialpadControllerDidCancel:self];但是这里 self.delegate 是 nil 所以我不能回到第一个视图。
    • 我鼓励您使用上述代码更新您的初始问题,以便检查错误。
    【解决方案3】:

    你必须确定 self.vc 是一个你所期望的类。也可以是 NavigationController

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多