在主视图控制器中显示警报视图(从子类调用)

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)

以上是关于在主视图控制器中显示警报视图(从子类调用)的主要内容,如果未能解决你的问题,请参考以下文章

从已关闭的视图控制器中显示警报

XIB 中的 UIView 子类不显示(drawRect:从未调用)

在所有视图控制器中创建警报功能 - swift

如何从视图控制器中包含的视图调用方法?

从 UIAlertView 弹出视图警报

iOS 应用程序在警报视图关闭时崩溃