2016-05-11 2 views
4

Я ищу способ вызова пользовательского предупреждения из нескольких контроллеров. До сих пор я сделал несколько разных попыток без успеха.Как использовать пользовательский UIAlertview в нескольких ViewControllers?

  • Я создал представление предупреждения с конструктором интерфейса, который отлично работает на одном контроллере представления, но не в другом.

  • Затем я попытался создать вид предупреждения программным образом, думая, что он может иметь какое-то отношение к выходам, которые не подключены к другому контроллеру. Это также работало на одном контроллере просмотра, а не на другом.

  • Я сделал отдельный быстрый файл и сделал публичную функцию и тот же результат. С помощью этого последнего метода я могу успешно повторно использовать обычный UIAlertController на нескольких контроллерах представления, но это не совсем то, что я ищу.

С помощью первых двух методов я не получаю компиляции ошибок. Приложение работает нормально, а затем сбой, когда я вызываю предупреждение с другого контроллера.

Заранее благодарим за ввод!

EDIT:

Этот пример работает, когда я положил в другой быстрой файл.

public func showSimpleAlert(title: String, message: String?, presentingController: UIViewController) { 

if IS_OS_8_OR_LATER() { 
    let controller = UIAlertController(title: title, message: message, preferredStyle: .Alert) 

    controller.addAction(UIAlertAction(title: "OK", style: .Cancel, handler: { (action) -> Void in 

    })) 

    presentingController.presentViewController(controller, animated: true, completion: nil) 
} else { 
    let alert = UIAlertView(title: title, message: message, delegate: nil, cancelButtonTitle: "OK") 
    alert.show() 
} 

}

Это один я хочу работать.

public func showAlert(oMsg: String, oTitle:String) { 
    alertView.backgroundColor = UIColor.whiteColor() 
    alertView.layer.cornerRadius = 25 

    alertTitleLabel.text = oTitle as String 
    alertTitleLabel.font = UIFont(name: "Open-Sans-Bold", size: 20) 
    alertTitleLabel.textColor = UIColor.blackColor() 
    alertTitleLabel.textAlignment = .Center 
    alertTitleLabel.numberOfLines = 1 
    alertTitleLabel.frame = CGRectMake(25, 60, 264, 112) 

    alertLabel.text = oMsg as String 
    alertLabel.font = UIFont(name: "Open-Sans", size: 20) 
    alertLabel.textColor = UIColor.blackColor() 
    alertLabel.textAlignment = .Center 
    alertLabel.numberOfLines = 4 
    alertLabel.frame = CGRectMake(25, 130, 264, 112) 

    okButton.setTitle("OK", forState: .Normal) 
    okButton.setTitleColor(UIColor.blueColor(), forState: .Normal) 
    okButton.frame = CGRectMake(60, 230, 197, 75) 
    okButton.addTarget(UIViewController.self, action:#selector(LoginViewController.buttonAction(_:)), forControlEvents: .TouchUpInside) 

}

+1

Это не очень понятно:. Почему не третий вариант удовлетворит? – Coder1000

+0

не уверен, что происходит с ошибкой. Вы можете попробовать некоторые открытые проекты о представлении предупреждения и настроить его, что хотите. Это лучше, чем построить новый. – truongky

+0

Вы случайно подключили выход делегата к своему пользовательскому виду предупреждения в IB? – sylvanaar

ответ

2

Я дам ответ на простой пользовательский alertview, которая в основном модифицированную UIViewController. вы можете использовать uiviewcontroller как uialertviewcontroller, как следует.

Простой AlertView ::

enter image description here

AlertVC:

import UIKit 

class ErrorAlert: UIViewController { 
    var titlenote:String = "" 
    var message:String = "" 

    @IBOutlet weak var cancelBtn: UIButton! 
    @IBOutlet weak var messageHolder: UILabel! 

    @IBOutlet weak var imageHolder: UIImageView! 
    @IBOutlet weak var titleHolder: UILabel! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view.backgroundColor = UIColor.black.withAlphaComponent(0.7) 
     // Do any additional setup after loading the view. 
    } 
    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

    } 
    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     self.messageHolder.text = self.message 
     self.titleHolder.text = self.titlenote 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func dismiss(_ sender: Any) { 
     self.dismiss(animated: true, completion: nil) 
    } 


} 

Это ViewController можно повторно использовать в любом ВХ и любое количество раз.

Useage Пример ::

let alertController = self.storyboard?.instantiateViewController(withIdentifier: "erroralert") as! ErrorAlert 
       alertController.titlenote = "Invalid login" 
       alertController.message = "Invalid facebook account." 
       alertController.providesPresentationContextTransitionStyle = true 
       alertController.definesPresentationContext = true 
       alertController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext 
       alertController.modalTransitionStyle = UIModalTransitionStyle.crossDissolve 
       self.present(alertController, animated: true, completion: nil) 

Я сделал фон alertviewvc полупрозрачный, установив значение альфа.

Фактический дисплей ::

enter image description here

Вы можете сделать более сложный alertview этим методом, но для повторного использования вы должны применить некоторую логику, как действия кнопки будет отличаться для разных ViewController. Пример. Иногда вы можете использовать alertview для предупреждения о выходе или когда-либо для отправки формы. Так что в обоих случаях действие будет отличаться, поэтому для повторного использования вам нужно написать дополнительную логику.

Другой alertView ::

enter image description here

Я надеюсь, что мой ответ поможет :)

+0

Спасибо, прошло некоторое время с тех пор, как мне это нужно, но это, похоже, то, что я искал в то время. Будет больше благодарность, вероятно, использование для будущих ссылок на любые другие проекты iOS, продвигающиеся вперед. – DG7

Смежные вопросы