Swift – 如何将视图控制器的引用传递给子UIView类?

我有一个UIViewController和一个UIView。 当我尝试在UIView中添加警报时,我必须使用控制器来呈现UIAlertController。 如何将UIViewController的引用传递给UIView类? 或者,我如何创建控制器的委托?

class GameViewController: UIViewController { @IBOutlet var gameBoardUIView: GameBoardUIView ... } class GameBoardUIView: UIView { ... func move() { if !gameBoard.checkNextMoveExist() { var alert = UIAlertController(title: "Game Over", message: nil, preferredStyle: UIAlertControllerStyle.Alert) alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Cancel, handler: {(action: UIAlertAction!) in println("Game Over") })) })) // Following would fail because self is not a UIViewController here // self.presentViewController(alert, animated: true, completion: nil) } } } 

遵循MVC模式,ViewController知道它的视图,但View不应该知道ViewController。 相反,您应该声明ViewController采用的GameBoardUIView委托协议,如下所示:

 // Delegate protocol declared here protocol GameBoardUIViewDelegate: class { func checkIfNextMoveExistsForGameBoardUIView(gameBoardUIView: GameBoardUIView) } class GameBoardUIView: UIView { // GameBoardUIView has a delegate property that conforms to the protocol // weak to prevent retain cycles weak var delegate:GameBoardUIViewDelegate? func move() { if !gameBoard.checkNextMoveExist() { delegate?.checkIfNextMoveExistsForGameBoardUIView(gameBoardUIView: self) } } } // View controller subclass adopts the protocol class GameViewController: UIViewController, GameBoardUIViewDelegate { @IBOutlet var gameBoardUIView: GameBoardUIView! override func viewDidLoad() { super.viewDidLoad() gameBoardUIView.delegate = self } // Delegte protocol method func checkIfNextMoveExistsForGameBoardUIView(gameBoardUIView: GameBoardUIView) { let alert = UIAlertController(title: "Game Over", message: nil, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: {(action: UIAlertAction!) in print("Game Over") })) // If you need to feed back to the game view you can do it in the completion block here present(alert, animated: true, completion: nil) } } 

或者,您也可以从.xib发布通知,并让父视图控制器观察它。 您可以在发布期间通过userInfo对象发送数据。