最近,我开始遇到一个问题,在一个针对较低iOS版本的项目中,从iOS 15开始有UIButton.Configuration个API可用.我使用界面生成器添加了一个UIButton,为了清楚地显示这个问题,我给它加上了"这是来自界面生成器的按钮标题集"的标题.在我的视图控制器中,我有以下更新按钮标题的代码:

class ViewController: UIViewController {
    @IBOutlet private var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        if #available(iOS 15, *) {
            var configuration = UIButton.Configuration.borderless()
            configuration.title = "This is button title set programmatically"
            button.configuration = configuration
        } else {
            button.setTitle("This is button title set programmatically", for: .normal)
        }
    }
}

它确实更新了按钮的标题,但只要我一touch 它,标题就会变回"这是来自界面生成器的按钮标题集".此外,如果我在界面生成器中将按钮"Style"属性设置为"Default"而不是"Plain",它将开始完全忽略我设置为configuration.title的任何值.调试显示,分配的按钮配置确实具有更新的标题,但它与其在屏幕上呈现的完全不同:

(lldb) po button.configuration?.title
▿ Optional<String>
  - some : "This is button title set programmatically"

从界面生成器返回到值的按钮标题如下所示:

Button title jumping back to the value set from Interface Builder

以下是按钮在界面生成器中的配置方式:

enter image description here

到目前为止,我找到的唯一修复方法是在配置更新处理程序中更新此按钮的标题,如下所示:

var configuration = UIButton.Configuration.borderless()
...
button.configuration = configuration
button.configurationUpdateHandler = { button in
    button.configuration?.title = "This is button title set programmatically"
}

问题是,如果我只希望我的按钮在不同的控件状态下具有相同的标题,或者这是一个已知的错误,我真的需要有一个配置更新处理程序吗? 对我来说,如果我在其他州也只有一个冠军头衔,那么似乎真的没有必要添加它.

推荐答案

问题是,你把你的应用程序放到了一个不一致的状态.如果这个应用程序应该在iOS 14上运行,你可以使用界面生成器中的普通按钮配置,因为iOS 14设备根本不知道该怎么做,你会崩溃的.

您需要做的是将界面构建器按钮设置为默认按钮,然后,如果您发现您在iOS 15或更高版本上运行,请将该按钮从界面中取出,并替换为基于配置的按钮,如下所示:

var configuration = UIButton.Configuration.borderless()
configuration.title = "This is button title set programmatically"
let newButton = UIButton(configuration: configuration)
newButton.frame = button.frame
button.removeFromSuperview()
button = newButton
self.view.addSubview(button)

要么这样,要么放弃在一个旨在支持iOS 14的项目中try 使用按钮配置.取而代之的是,坚持使用老式的setTitle(_:for:),等等.

或者停止try 完全支持iOS 14.

换句话说:不要使用按钮配置at all,除非你的应用程序运行的唯一系统是实际有support个按钮配置的系统.

Swift相关问答推荐

SwiftUI—如何识别单词并获取视觉中的位置

如何在HStack中均匀分布视图?

如何在自定义视图中读取修改符子元素?

我正在try 通过代码设置节中页眉和页脚的高度,但它不起作用

我可以为UIMenu设定一个固定的订单吗?

异步/等待函数的XCTAssertThrowsError

KMM-Swift铸造密封类

SwiftUI:按钮的圆形边缘的边框尺寸加倍

是否可以使用 .task 修饰符更新基于两个值的视图

用户输入以更改通过点击生成的形状大小

如何在 Swift 中的两个 UIView 中心之间添加线?

SwiftUI 4 列表初始化程序在 iOS 中不可用

如何在 RxSwift 中获取 controlEvent 类型?

用于 Swift 编码的 iOS 应用程序的 Ffmpeg

如何仅将 SwiftUI 不透明度应用于父视图?

swift中的SequenceType和CollectionType有什么区别?

使用 swift 运行 pod install 时出错

自定义 Google 登录按钮 - iOS

WKWebView 确实从本地文档文件夹加载资源

如何在 Swift 中从字符串创建类的实例