将 Delegate 分配给 PopoverPresentationController 时出现 Nil 错误

Posted

技术标签:

【中文标题】将 Delegate 分配给 PopoverPresentationController 时出现 Nil 错误【英文标题】:Nil error assigning Delegate to PopoverPresentationController 【发布时间】:2016-06-27 12:42:33 【问题描述】:

我在 Xcode 7.3 中使用 Swift 2.2 将 Delegate 分配给 PopoverPresentationController 时遇到问题

使用 Delegate 的原因是我试图在按下 Popover 视图(RedeemViewController 类)之外返回主菜单(MenuViewController 类)时触发一个函数。这在没有按钮的情况下发生。该函数存在于MenuViewController中,但与现在的作用无关,所以我只包括了发生错误的Delegation部分。

class MenuViewController: UIViewController, UIPopoverPresentationControllerDelegate 

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

  if (sender as! UIButton == btnRedeem) 
          let rvc = segue.destinationViewController as! RedeemViewController
          let nav = UINavigationController(rootViewController: rvc)
          let popover = nav.popoverPresentationController
          popover!.delegate = self
  

 

按下按钮 btnRedeem,连接到 Segue 到 Popover 视图,RedeemViewController,导致

致命错误:在展开可选值时意外发现 nil

在 Xcode 中,调试器指向

popover!.delegate = self

Segue 存在并在故事板中命名。右键单击视图时没有警告或过时的引用。

将代码替换为

popover?.delegate = self

导致调试器在 AppDelegate 中停止的更一般的错误:

libc++abi.dylib:以 NSException 类型的未捕获异常终止

我查看了here,但没有任何可能的原因适用。我有一个通用的 AppDelegate.swift,如 here 所述。

任何帮助表示赞赏!我主要找到带有按钮的示例,但不想使用按钮退出 Popover,因为它不是必需的。

关于代表团的附加信息:我需要在后台运行的功能是

popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController)

检查 Popover 视图 (RedeemViewController) 何时退出以及我想要在其中触发的功能是显示一个新按钮的功能。

感谢您的阅读,也许您可​​以帮助我!

干杯,

弗洛里斯

【问题讨论】:

【参考方案1】:
let nav = UINavigationController(rootViewController: roc)

在这里,您将创建一个全新的导航控制器,并将根 VC 作为 segue 的目标控制器。这是行不通的——目标控制器将使用它需要的任何容器进行设置,您无需在 prepareForSegue 中创建新的视图控制器。

您想查看rvcpopoverPresentationController,而不是某些不会添加到屏幕的导航控制器:

if (sender as! UIButton == btnRedeem) 
      let rvc = segue.destinationViewController as! RedeemViewController
      let popover = rvc.popoverPresentationController
      popover!.delegate = self

【讨论】:

感谢您对 jrturton 的帮助,但我仍然收到 "fatal error: unexpectedly found nil while unwrapping an Optional value" 指向 popover!.delegate = self跨度> 如果是这种情况,那么就没有弹出显示控制器。当您点击该按钮时,此视图控制器是否真的出现在弹出窗口中?你在做正确的转场吗? RedeemViewController 确实出现了,它是正确的 segue。在 if 语句中,如果我声明哪个 segue 而不是哪个按钮,那么它也可以工作,因此引用 segue 不是问题。如:if (segue.identifier == "segueToRedeemPopover") //do stuff 序列被命名并以 Popover 作为类型。 RedeemViewController 只是一个普通的 UIViewController class RedeemViewController: UIViewController, UITextFieldDelegate

以上是关于将 Delegate 分配给 PopoverPresentationController 时出现 Nil 错误的主要内容,如果未能解决你的问题,请参考以下文章

将项目分配给ansible中的var with_items

当我遵守协议时,关于分配给 id<UITextFieldDelegate> 的警告

在 iOS 15 中未分配 Alamofire 4.9.1 sessionManager.delegate.sessionDidReceiveChallenge

Swift 3 - 如何在 .xib 文件上为 UIScrollView 分配委托?

关于js模拟c#的Delegate(委托)实现

委托(delegate)