【问题标题】:Swift: Converting UIButton into UIBarButtonItem, does it really have to be this complicated?Swift:把UIButton转成UIBarButtonItem,真的要这么复杂吗?
【发布时间】:2017-06-26 16:18:39
【问题描述】:

我在UIButton 上编写了一个扩展,它将UIButton 转换为UIBarButtonItem

我尝试使用UIBarButtonItem 上的init(customView 传递我的按钮来最简单的解决方案,如下所示:

lazy var myButton: UIButton = { 
    let button = UIButton(type: .custom)
    // setting up button here...
    return button
}()

let barButtonItem = UIBarButtonItem(customView: myButton)

但我遇到了几个限制问题。实际上,我不想只在导航栏中放置一个按钮,而是要放置三个项目。所以我尝试将我的三个按钮放入UIStackView,然后设置navigationItem.rightBarButtonItem = UIBarButtonItem(customView: stackView),这就像iOS 10 上的魅力。但在 iOS 9 上,按钮的位置不起作用。

无论如何我都使用UIBarButtonItem而不是UIButtons,但我不想为iOS 9创建UIBarButtons,而是为iOS 10创建UIButtons。所以我写了一个扩展来创建UIBarButtonItem来自UIButtons。这启用了此代码。

处理 iOS 9 和 iOS 10 的解决方案

func setupNavigationBar() {
    if #available(iOS 10.0, *) {
        let stackView: UIStackView = [.views(buttons)] //syntax enabled by framework `ViewComposer`: github.com/Sajjon/ViewComposer
        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: stackView)
    } else {
        navigationItem.rightBarButtonItems = buttons.reversed().flatMap { $0.barButtonItem } // syntax enabled by extension below
    }
}

这是我的扩展代码。

扩展 UIButton

extension UIButton {

    var barButtonItem: UIBarButtonItem? {
        return barButtonItem()
    }

    func barButtonItem(
        style: UIBarButtonItemStyle = .plain,
        state: UIControlState = .normal,
        controlEvent: UIControlEvents = .primaryActionTriggered
        ) -> UIBarButtonItem? {

        guard
            let target = allTargets.first,
            let selectorName = actions(forTarget: target, forControlEvent: controlEvent)?.first,
            case let image = image(for: state), case let title = title(for: state),
            (image != nil || title != nil)
            else { return nil }

        let action = NSSelectorFromString(selectorName)

        if let image = image {
            return UIBarButtonItem(image: image, style: style, target: target, action: action)
        }

        if let title = title {
            return UIBarButtonItem(title: title, style: style, target: target, action: action)
        }

        return nil //should not happen
    }
}

问题 1:为什么在 iOS 9 中无法将 UIButtons 定位在 UIStackView 中?

问题 2:我的扩展程序是否过于复杂?还是不知何故不安全?

【问题讨论】:

    标签: ios swift swift3 uinavigationbar uibarbuttonitem


    【解决方案1】:

    扩展可以简化

    extension UIButton {
        func toBarButtonItem() -> UIBarButtonItem? {
            return UIBarButtonItem(customView: self)
        }
    }
    

    【讨论】:

    • 我希望我能多次投票!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2011-08-09
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多