簡體   English   中英

在Swift 3中按下按鈕時如何轉到另一個視圖控制器

[英]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。

  1. 應該是OverlayViewDelegate而不是OverlayViewControllerDelegate因為它不是發送事件的控制器,對嗎? OverlayView的角度來看,誰真正實現此協議並不重要,但誰發送事件則更重要。

  2. 您可能在某個地方有一個視圖控制器,它將implement此協議:

class ViewController: UIViewController, OverlayViewDelegate {
    //another code
    func didCancel(overlayView: OverlayView) {
         //show a new controller
    }
}
  1. 以編程方式顯示新控制器。 您可以模態顯示它或將其推送到導航堆棧。 如果只顯示一個控制器並且沒有更深的視圖控制器可顯示,則第二種方法是可取的,第二種方法是將越來越多的控制器推入導航堆棧。

推送到導航堆棧:

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)
  1. 顯示使用segues的新控制器。 您可以通過在按住右鍵的情況下拖動來在情節提要中從一個視圖控制器到另一個視圖控制器創建序列。 如果您指定了一個分鏡腳本ID,則perform從如下代碼perform該segue:

performSegue(withIdentifier: "segueIdentifier", sender: nil)
performSegue(withIdentifier: "segueIdentifier", sender: someUsefulData)

segue本身可以 模態 推送呈現 ,只需在創建時選擇正確的類型即可。

  1. 這很可能是您的情況。 如果已經提供了一個視圖控制器並且想返回,請在處理回調時使用dismiss(animated:completion :)

func didCancel(overlayView: OverlayView) {
    dismiss(animated: true, completion: nil)
}
  1. 如果已經將視圖控制器推送到導航堆棧,則可以使用popViewController(animated :)返回

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM