将 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 中创建新的视图控制器。
您想查看rvc
的popoverPresentationController
,而不是某些不会添加到屏幕的导航控制器:
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 错误的主要内容,如果未能解决你的问题,请参考以下文章
当我遵守协议时,关于分配给 id<UITextFieldDelegate> 的警告
在 iOS 15 中未分配 Alamofire 4.9.1 sessionManager.delegate.sessionDidReceiveChallenge