我想在 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 的内容
如何在swift中按下按钮从另一个xib文件加载另一个xib文件