Swift中的自定义警报

时间:2017-07-11 07:59:09

标签: ios swift xcode uialertcontroller

我一直在寻找很长时间自己制作自定义警报视图。但没有成功。我所做的是我在故事板中的xib文件中设计一个视图并将其加载到应用程序中,但它只是像常规视图一样显示。我想要做的是使用Swift 3将此视图显示为iOS> = 8中的AlertController。我做的是

let alert = Bundle.main.loadNibNamed(“xib file to load", owner: self, options: nil)?.last as! UIView

se       // showAlert(alert: alert)

func showAlert(alert: UIView){

    let windows = UIApplication.shared.windows

    let lastWindow = windows.last

    print(lastWindow)

    alert.frame = CGRect(x: 0, y: 0, width: 150, height: 300)

    alert.center = self.view.center

    lastWindow?.addSubview(alert)

}



func removeAlert(alert: UIView){

    alert.removeFromSuperview()

}

这只是显示和隐藏视图。但我希望它像UIAlertController一样呈现。我希望背景中的所有内容都变暗,只关注这个视图。我怎样才能做到这一点。请帮我解决这个问题。

3 个答案:

答案 0 :(得分:1)

首先,您应该永远触摸iOS上的window。除了非常罕见的特殊情况。

您可以在.xib中创建透明或半透明背景的视图。然后,您可以定义协议以显示此视图:

protocol AlertPresenting {}

extension AlertPresenting {
    func showAlert(_ onView: UIView) {
        if let alert = Bundle.main.loadNibNamed("AlertView", owner: nil, options: nil)![0] as? AlertView {
            alert.translatesAutoresizingMaskIntoConstraints = false

            onView.addSubview(alert)
            //here define constraints
            onView.bringSubviewToFront(alert)
        }
    }
}

然后您可以在任何viewController上使用它:

class MyViewController: UIViewController, AlertPresenting {
    func someFunction() {
        showAlert(onView: self.view)
    }
}

警报将高于views

答案 1 :(得分:0)

let alert = UIAlertController(title: "Record Inserted", message: 
"Record Inserted", preferredStyle: UIAlertController.Style.alert)

alert.addAction(UIAlertAction(title: "Ok", 
style:UIAlertAction.Style.default, handler: nil))

self.present(alert, animated: true, completion: nil)

答案 2 :(得分:0)

在具有透明背景视图的情节提要中创建一个视图控制器,然后将其显示

let storyBoard = UIStoryboard(name: "Alert", bundle: .main)
let viewController : UIViewController = storyBoard.instantiateViewController(withIdentifier: "AlertController")

customAlertController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
customAlertController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve

self.present(customAlertController, animated: true, completion: nil)