如何在swift 3中按下按钮时转到另一个视图控制器

时间:2016-10-24 21:07:58

标签: ios swift function button swift3

此代码位于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)


}

我想要做的就是点击取消按钮的任何时候。是使当前页面转换为视图控制器的页面。我想从第一页到第二页。

2 个答案:

答案 0 :(得分:3)

  1. 它应该是OverlayViewDelegate而不是OverlayViewControllerDelegate,因为它不是您发送活动的控制器,对吗?从OverlayView的角度来看,实际执行此协议的人员并不重要,但发送活动的人更重要。

  2. 你可能在某个地方有一个视图控制器,这将是implement这个协议:

  3. class ViewController: UIViewController, OverlayViewDelegate {
        //another code
        func didCancel(overlayView: OverlayView) {
             //show a new controller
        }
    }
    
    1. 以编程方式显示新控制器。 您可以以模态方式呈现它或将其推送到导航堆栈。如果您只显示一个控制器并且没有更深的视图控制器显示,则第一种方法更可取,其次是将越来越多的控制器推入导航堆栈。
    2. 推送到导航堆栈:

      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显示新控制器。 您可以通过拖动按下右键来在故事板中从一个视图控制器创建一个segue到另一个视图控制器。如果您分配了一个故事板ID,那么您可以perform从这样的代码中删除:
      2. performSegue(withIdentifier: "segueIdentifier", sender: nil)
        performSegue(withIdentifier: "segueIdentifier", sender: someUsefulData)
        

        segue本身可以推送以模态方式呈现,只需在创建时选择正确的类型。

        1. 这很可能就是您的情况。如果您已经提供了一个视图控制器,并且想要返回,请在处理回调时使用dismiss(animated:completion:)
        2. func didCancel(overlayView: OverlayView) {
              dismiss(animated: true, completion: nil)
          }
          
          1. 如果您已将视图控制器推送到导航堆栈,则可以使用popViewController(animated:)返回:
          2. func didCancel(overlayView: OverlayView) {
                navigationController?.popViewController(animated: true)
            }
            

答案 1 :(得分:0)

将这些扩展添加到项目中,您可以使用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