在主视图控制器中显示警报视图(从子类调用)
Posted
技术标签:
【中文标题】在主视图控制器中显示警报视图(从子类调用)【英文标题】:present alert view in main view controller (called from subclass) 【发布时间】:2015-12-07 21:04:58 【问题描述】:我的应用中有两个视图。一个主视图(ViewController.swift)和一个侧边栏(SideBar.swift)。如果我点击侧边栏中的按钮,则应该显示UIAlertView
(我在 ViewController.swift 中调用了一个函数)。但是应用程序崩溃了,因为主视图为零。你知道我该如何解决这个问题吗?
我在函数中的代码(显示警报):
let alertView = UIAlertController(title: "You need to log in first", message: "To access the special features of the app you need to log in first.", preferredStyle: .Alert)
alertView.addAction(UIAlertAction(title: "Login", style: .Default, handler: (alertAction) -> Void in
))
alertView.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
self.presentViewController(alertView, animated: true, completion: nil)
崩溃日志:
0x724160 <+60>: bl 0x75961c ; function signature specialization <Arg[0] = Exploded, Arg[1] = Exploded> of Swift.(_fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt) -> ()).(closure #2)
-> 0x724164 <+64>: trap
【问题讨论】:
你在侧边栏类中引用了 ViewController.swift 吗? 【参考方案1】:我想到了两种解决方案。
-
声明一个协议并使用委托将警报调用传递给 MainView。
首先,在我们的 SideBar.swift 中定义一个协议(我们称之为 AlertDelegate)。
protocol AlertDelegate
func alertMain()
现在我们在 SideBar.swift 中创建一个委托变量。
var alertDelegate:AlertDelegate?
然后我们让我们的 MainView (ViewController.swift) 遵守 AlertDelegate 协议。
class ViewController: UIViewController,foo,bar,AlertDelegate
并添加 AlertDelegate 协议的功能。这里是你放置 UIAlertController 代码的地方。
func alertMain()
//Present UIAlertController
最后,我们要设置 ViewController 到委托 alertDelegate
使用 AppDelegate KeyWindow 呈现您的 UIAlertController。我可能不会推荐这种方法,但你会这样做。
UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
【讨论】:
非常感谢您的回答!你能给我一个例子,我怎么能做到这一点?我还在学习 Swift。 Swift 4: UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil)以上是关于在主视图控制器中显示警报视图(从子类调用)的主要内容,如果未能解决你的问题,请参考以下文章