繁体   English   中英

快速从子类功能导航到ViewController

[英]Navigate to viewcontroller from a subclass function in swift

我用UIToolbar创建了一个UINavigationController UIToolbar内部,有多个UIBarButtonItems UIToolbar有一个子类,我可以使用该子类来设置工具栏设置和创建UIBarButtonItems

通过按下UIBarButtonItem我想导航到另一个ViewController。 如您在下面的代码中看到的,我为.addTarget创建了一个函数,称为“ settingsPressed ”。

//SetToolbar

class ToolbarClass: UIToolbar {

//Set height of toolbar
override func sizeThatFits(_ size: CGSize) -> CGSize {
    var size = super.sizeThatFits(size)
    size.height = 60
    return size
}

//Toolbar settings
override func layoutSubviews() {
    super.layoutSubviews()

    //Default
    self.isTranslucent = false
    self.barTintColor = UIColor(red: 48/255, green: 148/255, blue: 172/255, alpha: 1)

    //Buttons

    //Settings
    let settingsBtn = UIButton()
    settingsBtn.frame = CGRect(x: 0, y: 0, width: 46, height: 46)
    settingsBtn.setImage(UIImage(named: "Settings-Button")?.withRenderingMode(.alwaysOriginal), for: .normal)
    settingsBtn.addTarget(self, action: #selector(self.settingsPressed), for: .touchUpInside)
    let settingsButton = UIBarButtonItem()
    settingsButton.customView = settingsBtn


    self.setItems([settingsButton], animated: false)

}

func settingsPressed() {
   //How to navigate to a viewcontroller?
}

}

我发现一些快速代码可以导航到另一个ViewController,但是这些代码在我的情况下不起作用,因为我正在使用子类。 在这种情况下,“。self.storyboard?” 没有道理:

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "ClassesOverviewViewController") as!  ClassesOverviewViewController
self.navigationController?.pushViewController(secondViewController, animated: true)

您的实现违反了MVC原则,并引起了您根本不应该面对的问题。 您不应在视图中添加控制器逻辑(创建新的VC并导航到它)(UIToolbar及其子类是视图元素)。

  1. 修复它的第一种方法:将UIToolbar添加到带有添加的设置按钮按钮项的情节提要视图中,将按钮按钮项的动作与您的VC中的功能连接起来,实现此功能进行导航。
  2. 修复它的第二种方法:离开UIToolbar的子类(如果仅在子类中添加条形按钮项目,则不建议这样做),为设置条形按钮项目声明公共属性,使用targetaction将VC设置为target,将VC中的功能设置为设置栏按钮项的操作,实现此功能进行导航。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM