2016-10-26 5 views
0

У меня есть ViewController на моей раскадровке, которая работает как предупреждение (с заголовком, сообщением и двумя кнопками).Как инкапсулировать UIViewController (например, UIAlertController) в Swift?

Я хотел бы оформить его, чтобы иметь возможность использовать его в любом месте в своем коде, как это:

let alert = CustomAlertViewController(title: "Test", message: "message de test.", view: self.view, delegate: self) 
self.present(alert, animated: false, completion: nil) 

Моя проблема заключается в том, что IBOutlets не инициализирована ...

Мой CustomAlertViewController:

public protocol CustomAlertProtocol { 
    func alertAccepted() 
} 

class CustomAlertViewController: UIViewController { 

    var delegate :CustomAlertProtocol? = nil 
    var parentView :UIView? 
    var blurScreenshot :SABlurImageView? 

    var alertTitle :String? = nil 
    var alertMessage :String? = nil 

    @IBOutlet weak var oAlertView: UIView! 
    @IBOutlet weak var oAlertTitle: UILabel! 
    @IBOutlet weak var oAlertMessage: UILabel! 


    //MARK: - Main 

    public convenience init(title: String?, message: String?, view: UIView, delegate: CustomAlertProtocol) { 
     self.init() 
     self.alertTitle = title 
     self.alertMessage = message 
     self.delegate = delegate 
     self.parentView = view 
    } 

    override func viewDidLoad() { 
     oAlertTitle.text = self.alertTitle 
     oAlertMessage.text = self.alertMessage 
    } 

    @IBAction func onAcceptButtonPressed(_ sender: AnyObject) { 
     delegate?.alertAccepted() 
    } 
} 
+0

Чтобы установить IBOutlets yo Вам нужно создать элемент управления view из сцены раскадровки или файла nib. Вам нужно будет создать функцию класса, которая делает это, а не используя Initializer. – Paulw11

+0

My ViewController находится в моей раскадровке, и IBOutlets связаны. Если я создаю экземпляр с помощью storyboard.instantiateViewController, IBOutlets инициализируются – Will

+0

Вправо. Поэтому создайте функцию класса, которая делает это – Paulw11

ответ

1

Установите Custom Class свойство вашего View Controller для CustomAlertViewController
и Storyboard ID, что бы вы ни хотели - например, CustomAlertViewControllerIdentifier в Identity Inspector InterfaceBuilder.

А затем создать его экземпляр, как следующее:

let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) 

guard let vc = storyboard.instantiateViewControllerWithIdentifier("CustomAlertViewControllerIdentifier") as? CustomAlertViewController else { 
    return 
} 

редактировать:

Вы можете поместить этот код в функции класса, как:

extension CustomAlertViewController { 
    class func instantiateFromStoryboard(title: String?, message: String?, view: UIView, delegate: CustomAlertProtocol) -> CustomAlertViewController { 
     let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) 
     let vc = storyboard.instantiateViewControllerWithIdentifier("CustomAlertViewControllerIdentifier") as! CustomAlertViewController 

     vc.title = title 
     vc.message = message 
     vc.view = view 
     vc.delegate = delegate 

     return vc 
    } 
} 

, а затем использовать как:

let myCustomAlertViewController = CustomAlertViewController.instantiateFromStoryboard(title: "bla", ...) 
+0

Да, но я не хотел этого делать каждый раз, когда я хочу использовать свой CustomAlertViewController ... – Will

+0

Я добавил примерную функцию класса, как вы могли бы инкапсулировать создание экземпляра диспетчера представлений 'CustomAlertViewController'. Надеюсь, это поможет. –

+0

Отлично, он работает! Благодаря ! – Will