使用 Swift 以编程方式创建的 UIBarButtonItem,不可见

Posted

技术标签:

【中文标题】使用 Swift 以编程方式创建的 UIBarButtonItem,不可见【英文标题】:UIBarButtonItems created programatically with Swift, not visible 【发布时间】:2016-08-21 07:32:54 【问题描述】:

我不确定为什么应该在导航控制器的工具栏中嵌入两个条形按钮项的这段代码不起作用。当我运行我的代码时,工具栏本身可见,但栏按钮项不可见。我在这里做错了什么?感谢关注。

class NavigationController: UINavigationController 

    override func viewDidLoad() 
        super.viewDidLoad()

        //Tool bar appearance
        toolbar.barTintColor = UIColor.blackColor()


        //Show tool bar by default
        self.navigationController?.toolbarHidden = false

        //Icons all located in images.xcassets
        let homeImage = UIImage(named: "home")
        let gameImage = UIImage(named: "logo")

        var toolBarItems = [UIBarButtonItem]()

        let homeButton = UIBarButtonItem(image: homeImage, style: UIBarButtonItemStyle.Plain, target: self, action: #selector(NavigationController.toHome))
        homeButton.title = "Home"


        let gameButton = UIBarButtonItem(image: gameImage, style: UIBarButtonItemStyle.Plain, target: self, action: #selector(NavigationController.toGame))
        homeButton.title = "Game"

        //Place the bar items in toolBarItems array
        toolBarItems.append(homeButton)
        toolBarItems.append(gameButton)

        //self.toolbar.items = toolBarItems
        self.toolbar.setItems(toolBarItems, animated: true)

    //End viewDidLoad


    func toHome() 
        let homeVC = HomeViewController(nibName: "HomeViewController", bundle: nil)
        self.pushViewController(homeVC, animated: true)
    

    func toGame() 
        let gameVC = GameViewController(nibName: "GameViewController", bundle: nil)
        self.pushViewController(gameVC, animated: true)
    


【问题讨论】:

【参考方案1】:

您是否为依赖控制器创建了第二个 .swift 文件?您应该将此代码移动到依赖的控制器文件中

self.navigationController?.toolbarHidden = false

    let button1 = UIBarButtonItem(title: "home", style: .Plain, target: self, action: #selector(SecondViewController.home))

    let myToolBar = [button1]

    self.setToolbarItems(myToolBar, animated: true)

【讨论】:

是的。您可以使用 toolbar.hidden = false 如前所述。谢谢!我也会更正我的代码 不确定您所说的“依赖控制器”是什么意思 我的意思是。我的项目中的每个控制器都有文件。一个 .swift 用于导航控制器,另一个用于其被告(例如表格视图控制器或视图控制器) 我为每个视图控制器和导航控制器都有一个单独的 .swift 文件。工具栏在每个视图控制器中都是可见的,但不会显示工具栏按钮。【参考方案2】:

我不确定,但我认为您的按钮大小为 0。所以也许您应该添加一些约束或查看框架大小。您可以尝试使用view hierarchy debugger 进行调试。

【讨论】:

【参考方案3】:

也许你只需要替换这个self.navigationController?.toolbarHidden = false 有了这个toolbarHidden = false

我对您的代码感到困惑。您向我们展示的类是所有其他 ViewController 所依赖的一个导航控制器,还是它本身是一个依赖的 ViewController,在这种情况下似乎是一个导航控制器?或者它是一个错误的导航控制器? (不太可能)

我为什么要问?有一次您指的是带有self.navigationController?.toolbarHidden = false 的父导航控制器,它不是这个导航控制器本身。然后在其余代码中,您将引用此控制器本身。

希望这会导致正确的想法。

【讨论】:

该类确实是所有其他视图控制器所依赖的一个导航控制器。根据我对导航控制器的了解,它们有一个固有的导航栏和一个工具栏,可以在其中嵌入栏按钮项。我想要做的是将条形按钮嵌入到属于此导航控制器的工具栏上,最终应该对作为导航控制器子级的所有视图控制器可见。 我现在明白为什么它应该只是 toolbarHidden = false 我修复了那一行,但现在仍然改变了。工具栏仍然可见,但栏按钮不显示 我通常让故事板来做所有这些事情。在这些情况下,它会自动定义 rootVieController。你是否有一个?在情节提要中定义还是以编程方式定义?很有可能,NavigationController 仅在此根控制器存在的情况下呈现和布局所有内容。 不,该应用程序纯粹是程序化的。有这么多活动的部分,我很早就决定不去故事板 听起来,你应该添加 rootViewController 看看会发生什么。

以上是关于使用 Swift 以编程方式创建的 UIBarButtonItem,不可见的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 以编程方式创建标题栏约束

Swift 以编程方式创建一个 unwind segue

在 Swift 中以编程方式创建 NSTextField

设置 UIBarButtonItem 的背景图像以编程方式更改其大小

如何使用 Swift 以编程方式创建 Hexagon UIButton 或 Clickable ImageView

使用 Cocoa 在 Swift 4.0 中以编程方式创建复选框的标准方法是啥?