如何自定义 SwiftUI SegmentedPicker

Posted

技术标签:

【中文标题】如何自定义 SwiftUI SegmentedPicker【英文标题】:How to Customize SwiftUI SegmentedPicker 【发布时间】:2020-11-25 21:37:02 【问题描述】:

我在 SwiftUI 中使用 SegmentedPicker 样式的 Picker。

我正在尝试更改选择器的颜色,并在 *** 中找到了此代码。 How to change selected segment color in SwiftUI Segmented Picker

init() 
    UISegmentedControl.appearance().selectedSegmentTintColor? = .blue
    UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.white], for: .selected)
    UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.blue], for: .normal)

但是弹出一个错误说“从初始化程序返回而不初始化所有存储的属性”

我该怎么做才能使错误消失:(

【问题讨论】:

【参考方案1】:

如果您提供自己的 init() 方法,则必须初始化所有属性。由于几乎每个属性都有一个默认值,因此您只需初始化 Binding 即可使您的代码正常工作...

init(showLoginView: Binding<Bool>) 
    self._showLoginView = showLoginView //<< here init your stored properties

    UISegmentedControl.appearance().selectedSegmentTintColor? = .blue
    UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.white], for: .selected)
    UISegmentedControl.appearance().setTitleTextAttributes([.foregroundColor: UIColor.blue], for: .normal)

【讨论】:

【参考方案2】:

如果您要在 LoginSheetView 的 init 中调用它,您还需要在 init 函数中设置所有其他变量。

当您设置 UISegmentedControl.appearance() 时,它会在您的应用中为所有 UISegmentedControl 全局设置外观。由于它因此不需要在 LoginSheetView 中调用,因此简单的解决方案是将此 init 移动到没有其他 init 变量的初始视图之一,例如调用 @main 的 ___App.swift 文件.

【讨论】:

感谢您的帮助!但我刚开始学习 swiftUI,所以我不确定你的意思。那么我可以添加另一个 .swift 文件并添加一个视图结构,然后将上面的代码粘贴到结构中吗?或者我应该把它放在另一个结构视图中的初始化函数中,在那里我在另一个视图中自定义了导航栏的设置? 当您创建应用程序时,会自动创建一个名为“[yourappname]App.swift”的文件。在文件中,它可能会在某处说“@main”,这基本上意味着当您构建应用程序并将其运行到设备时,应用程序的起点将是该文件。您可以将 init 函数放入该文件中。

以上是关于如何自定义 SwiftUI SegmentedPicker的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swiftui 中添加自定义字体?

如何查看 SwiftUI 可以作为自定义字体提供的其他字体选项?

如何在 SwiftUI 视图中使用自定义 UI 控件,例如 Button?

如何自定义 SwiftUI SegmentedPicker

如何修复自定义按钮在 SwiftUI(IOS) 中的交互?

SwiftUI:如何在 MapKit 中自定义地理区域的位置?