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

时间:2015-12-07 21:04:58

标签: ios swift view uialertview viewcontroller

我的应用程序中有两个视图。主视图(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   

1 个答案:

答案 0 :(得分:2)

我想到了两种解决方案。

  1. 声明协议并使用委托将警报调用传递给MainView。
  2. 首先,在我们的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

    1. 使用AppDelegate KeyWindow呈现您的UIAlertController。我可能不会推荐这种方法,但这就是你要做的。

       UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(alert, animated: true, completion: nil)