【问题标题】:How to go to another view controller when button is pressed in swift 3在swift 3中按下按钮时如何转到另一个视图控制器
【发布时间】:2017-03-06 18:31:31
【问题描述】:

这段代码在 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页。

【问题讨论】:

  • page apage b 是什么?

标签: ios swift function button swift3


【解决方案1】:
  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. 显示使用 segue 的新控制器。 您可以通过按住右键拖动来在情节提要中创建从一个视图控制器到另一个视图控制器的 segue。如果您分配故事板 id,则可以perform 与这样的代码分离:

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

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

  1. 这很可能是你的情况。如果你已经有一个视图控制器并且你想返回,当你处理回调时使用dismiss(animated:completion:)

func didCancel(overlayView: OverlayView) {
    dismiss(animated: true, completion: nil)
}
  1. 如果您已经将视图控制器推送到导航堆栈,则可以使用 popViewController(animated:) 返回:

func didCancel(overlayView: OverlayView) {
    navigationController?.popViewController(animated: true)
}

【讨论】:

  • 此代码是应用程序的一部分,该应用程序具有用于拍照的笔尖。无论出于何种原因拍摄照片时,取消都不会将用户传送到视图控制器,它只会显示您刚刚拍摄的照片的全屏图像。我希望取消按钮将我带回视图控制器天气,或者您没有拍照。我认为原始代码不会有太大变化,因为代码仍然要拍照。这是一个解释我的问题的视频链接。 youtube.com/watch?v=rIMmngzuUxY
  • @JCSAM 检查更新。我猜你只需要dismiss 你的overlay view controller (p.5)
【解决方案2】:

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

【讨论】:

  • 这段代码会取代我之前写的所有代码吗?我不明白拍摄按钮在哪里,取消在哪里。
  • 以上回应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
相关资源
最近更新 更多