我有一个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)
}
}
}
答案 0 :(得分:17)
遵循MVC模式,ViewController知道它的视图,但View不应该知道ViewController。相反,您应该声明GameBoardUIView
采用的ViewController
委托协议,如下所示:
// 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)
}
}
答案 1 :(得分:0)
或者,您也可以从.xib发布通知并让父视图控制器观察它。您可以在发布期间通过userInfo对象发送数据。