[英]How to go to another view controller when button is pressed in swift 3
這段代碼在OverlayView.swift中
protocol OverlayViewControllerDelegate {
func didCancel(overlayView: OverlayView)
func didShoot(overlayView: OverlayView)
}
class OverlayView: UIView {
@IBOutlet weak var cameraLabel: UILabel!
var delegate: OverlayViewControllerDelegate! = nil
@IBAction func cancel(_ sender: AnyObject) {
cameraLabel.text = "I want to exit"
delegate.didCancel(overlayView: self)
}
我想做的就是隨時單擊取消按鈕。 是使當前頁面轉換為視圖控制器的頁面。 我想從頁面a轉到頁面b。
應該是OverlayViewDelegate
而不是OverlayViewControllerDelegate
因為它不是發送事件的控制器,對嗎? 從OverlayView
的角度來看,誰真正實現此協議並不重要,但誰發送事件則更重要。
您可能在某個地方有一個視圖控制器,它將implement
此協議:
class ViewController: UIViewController, OverlayViewDelegate {
//another code
func didCancel(overlayView: OverlayView) {
//show a new controller
}
}
推送到導航堆棧:
let newViewController = AnotherViewController()
self.navigationController?.pushViewController(vc, animated: true) //your current vc should be already in a UINavigationController
當前模態示例:
let newViewController = AnotherViewController()
self.present(newViewController, animated: true, completion: nil)
perform
從如下代碼perform
該segue: performSegue(withIdentifier: "segueIdentifier", sender: nil)
performSegue(withIdentifier: "segueIdentifier", sender: someUsefulData)
segue本身可以按 模態 推送或呈現 ,只需在創建時選擇正確的類型即可。
func didCancel(overlayView: OverlayView) {
dismiss(animated: true, completion: nil)
}
func didCancel(overlayView: OverlayView) {
navigationController?.popViewController(animated: true)
}
將這些擴展添加到您的項目中,就可以使用parentViewController
獲得視圖的視圖控制器。
//
// UIResponder+NextType.swift
//
// Created by Callam Poynter on 02/08/2016.
//
extension UIView {
var parentViewController: UIViewController? {
return next(UIViewController.self)
}
}
extension UIResponder {
func next<T: UIResponder>(_ type: T.Type) -> T? {
switch next {
case let responder as T:
return responder
case let .some(responder):
return responder.next(type)
default:
return nil
}
}
}
如果您在情節提要中准備了帶有標識符的segue:
parentViewController?.performSegueWithIdentifier("fromPageAToB", sender: nil)
或者,如果要手動實例化控制器,則可以使用以下命令顯示控制器:
parentViewController?.presentViewController(pageBController, animated: true, completion: nil)
如果您不想使用這些擴展名,而只是使用委托協議,請確保提供OverlayView
的控制器符合OverlayViewDelegate
並在控制器中將OverlayView
視圖的委托設置為self
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.