2016-10-26 105 views
0

我的故事板中有一個ViewController,它的工作方式類似於一個警報(帶有標題,消息和兩個按鈕)。如何在Swift中封裝UIViewController(如UIAlertController)?

我想封裝它能夠在我的代碼的任何地方使用它,像這樣:

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喲您需要從故事板場景或筆尖文件創建視圖控制器。您將需要創建一個類功能來完成此操作,而不是使用初始化程序 – Paulw11

+0

我的視圖控制器位於故事板中,並且IBOutlet已鏈接。如果我使用storyboard.instantiateViewController實例化IBOutlets被初始化 – Will

+0

正確。所以創建一個類函數,這樣做 – Paulw11

回答

1

設置您的視圖控制器的​​屬性CustomAlertViewController
Storyboard ID無論你想要什麼 - 例如InterfaceBuilder的Identity Inspector中的CustomAlertViewControllerIdentifier

然後實例它像以下:

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

相關問題