我想在 UIView 类中按下按钮时触发导航控制器

Posted

技术标签:

【中文标题】我想在 UIView 类中按下按钮时触发导航控制器【英文标题】:i want to triger navigationcontroller when i press button in UIView class 【发布时间】:2019-03-28 12:37:45 【问题描述】:

当我按下 UIView 类中的按钮时,我想将导航控制器触发到其他屏幕。我怎样才能做到这一点?

//创建Button Iboutlet的UIView类的代码

import UIKit

protocol ButtonDelegate: class  
    func buttonTapped()


class SlidesVC: UIView 

  var delegate: ButtonDelegate?

   @IBAction func onClickFinish(_ sender: UIButton) 

   delegate?.buttonTapped()

   

   @IBOutlet weak var imgProfile: UIImageView!

    

   //ViewController Class code in Which Button Protocol will be entertained

  class SwipingMenuVC: BaseVC, UIScrollViewDelegate 
         var  slidesVC = SlidesVC()

             override func viewDidLoad() 
                    super.viewDidLoad()

                    slidesVC = SlidesVC()
                    // add as subview, setup constraints etc
                    slidesVC.delegate = self

        

extension BaseVC: ButtonDelegate 
  func buttonTapped() 

 self.navigationController?.pushViewController(SettingsVC.settingsVC(), 
            animated: true)

   
   

【问题讨论】:

使用委托来完成这项工作 你能解释一下我应该怎么做吗?或者您可以发布任何解决方案? 【参考方案1】:

更简单的方法是使用 typealias。您必须在 2 个地方编写代码。 1. 您的 viewClass 和 2. 在您的 View Controller 中。

如果需要,请在 SlidesView 类中添加类型别名并定义参数类型,否则将其留空。

class SlidesView: UIView 
typealias OnTapInviteContact = () -> Void
var onTapinviteContact: OnTapInviteContact?

    @IBAction func buttonWasTapped(_ sender: UIButton) 
    if self.onTapinviteContact != nil 
      self.onTapinviteContact()
    

  


  class SwipingMenuVC: BaseVC, UIScrollViewDelegate 
             override func viewDidLoad() 
                    super.viewDidLoad()

                    let slidesView = SlidesView()
                    slidesView.onTapinviteContact =  () in
                    // do whatever you want to do on button tap
            

        

【讨论】:

是的,谢谢,我是这样做的。也感谢您的跟进:) 如果这有用,请将其标记为答案。按绿色勾号。【参考方案2】:

您可以使用委托模式告诉包含 ViewController 该按钮已被按下,并让它处理接下来需要执行的任何操作,视图并不需要知道发生了什么。

一个基本的例子:

protocol ButtonDelegate: class 
   func buttonTapped()


class SomeView: UIView 
    var delegate: ButtonDelegate?

    @IBAction func buttonWasTapped(_ sender: UIButton) 
        delegate?.buttonTapped()
    


class ViewController: UIViewController 
    var someView: SomeView

    override func viewDidLoad() 
       someView = SomeView() 
       // add as subview, setup constraints etc
       someView.delegate = self
     


extension ViewController: ButtonDelegate 
    func buttonTapped() 
        self.showSomeOtherViewController() 
        // or 
        let vc = NewViewController()
        present(vc, animated: true) 
    

【讨论】:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[MarriageApp.SwipingMenuVC onClickFinish:]:无法识别的选择器发送到实例 0x7fcdaa013e10”现在显示此错误 将更新后的代码添加到您的问题中。看起来您没有正确实施它。你不应该直接打电话给SwipingMenuVC onClickFinish 请检查更新的代码?? 您是否已将 IBOutlet 和 IBActions 连接到情节提要? 我已将 IBoutlets 和连接连接到不在控制器中的视图类。

以上是关于我想在 UIView 类中按下按钮时触发导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

在导航栏中按下后退按钮时刷新 RootViewController 的内容

查看内部视图更改

如何在nib文件中按下时禁用UIButton高亮显示?

如何在swift中按下按钮从另一个xib文件加载另一个xib文件

当我在模拟器中按下 Apple TV 游戏手柄按钮时,它们不会触发

知道何时在 ios 中按下 facebook 登录按钮