SwiftUI:如何将初始化程序分配给特定对象?
Posted
技术标签:
【中文标题】SwiftUI:如何将初始化程序分配给特定对象?【英文标题】:SwiftUI: How can I assign my initializer to a specific object? 【发布时间】:2019-11-20 11:00:36 【问题描述】:我使用UIScrollView.appearance().backgroundColor
来更改我的 ContentView 的背景颜色。但不幸的是,这有副作用,我的ModalView()
的颜色不再正常。
为了解决这个问题,我看到了三种可能的解决方案:
第一个选项是以某种方式将UIScrollView.appearance().backgroundColor = UIColor.red
仅分配给第一个ScrollView
。
第二种方法是找到另一种方法来更改我的ContentView()
的背景颜色。
第三个选项是将ModalView()
中的UIScrollView.appearance().backgroundColor
重置为默认设置。 (编辑:我认为现在第三个选项是不可能的)
感谢您的每一个回答
import SwiftUI
struct ContentView: View
@State private var show_modal: Bool = false
var body: some View
UIScrollView.appearance().backgroundColor = UIColor.red // This how I change the backgroundcolor of this View
return NavigationView
ScrollView // This ScrollView should be affected by the initializer
VStack(spacing: 12)
HStack
Text("Only unimportant content")
Spacer()
.padding(.horizontal).padding(.bottom)
.navigationBarTitle(Text("Header"))
.navigationBarItems(
leading:
Button(action: self.show_modal = true )
Image(systemName: "plus")
.padding(.all, 10)
.sheet(isPresented: self.$show_modal) ModalView() .padding(.leading, -10)
)
struct ModalView: View // This should not be affected by the initializer
@Environment(\.presentationMode) var presentationMode
@State private var name: String = ""
var body: some View
// UIScrollView.appearance().backgroundColor = UIColor.red // If anyone knows the default value, please enter this here
return NavigationView
Form
List
TextField("This is a TextField", text: $name)
.navigationBarTitle(Text(""), displayMode: .inline)
.navigationBarBackButtonHidden(true)
.navigationBarItems(
leading:
Button(action: self.presentationMode.wrappedValue.dismiss() )
Text("Cancel")
.padding(.vertical, 5)
)
这是我的ModalView()
,具有“美丽”的副作用
在这张图片中,你可以看到是什么让我相信第三种选择是不可能的: - 所选文本字段的内部变色 - 自动更正建议也会变色 - 打开深色模式后,情况会变得更糟
【问题讨论】:
那么不要改变UIScrollView
的外观。将修饰符应用于特定的ScrollView
但不幸的是,我不知道该怎么做。
只需在 ScrollView() 上使用 .background(Color.red) 修饰符。
【参考方案1】:
只需将背景颜色直接应用到滚动视图即可。
return VStack
ScrollView // This ScrollView should be affected by the initializer
Text("Text 1")
.background(Color.red)
ScrollView // This ScrollView should NOT be affected by the initializer
Text("Text 2")
【讨论】:
不,这不是我的问题的解决方案。它可能在上面的示例代码中工作,但正如我之前所说,这是一个大大简化的版本。不幸的是,它在我的实际项目中不起作用。但无论如何感谢您的回答。我对示例代码进行了一些编辑,使其更像我的真实项目。 @MattisSchulte 那么您是否有理由需要使用appearance()
API?您仍然可以为单个视图覆盖它。
是的,我需要appearance()
API,因为这是在同时使用ScrollView
和NavigationView
时更改ContenView(包括导航栏)背景颜色的最简单方法。但是你是对的,我仍然可以为个人视图覆盖它。因此,如果我能找到一种方法将 Appearance API 设置回默认值,我的问题就会得到解决。
只有在 swiftUI 无法达到你想要的效果时才使用外观()。在 swiftUI 中更改 ScrollView 的 backgroundcolor 应该不是问题,因此完全不需要外观()
@Mamaessen 很遗憾,在使用ScrollView
和NavigationView
时更改背景颜色是一个很大的问题。但如果你想了解更多关于这个话题的信息,here 是个好问题。【参考方案2】:
工作表的默认背景颜色是secondarySystemBackground。
UIScrollView.appearance().backgroundColor = UIColor.secondarySystemBackground
【讨论】:
好的,现在在您编辑问题后,我了解您的问题。 不,如果没有副作用,那也是行不通的。但我已经在问题中添加了对副作用的确切描述。【参考方案3】:您可以将模态视图指定为特定情况,如下所示:
UIScrollView.appearance().backgroundColor = UIColor.red //normal
UIScrollView.appearance(whenContainedInInstancesOf: [UIPresentationController.self]) .backgroundColor = UIColor.white //modal
如果你想要更好的结果,只需指定 UIScrollView 的子类。
UIScrollView.appearance().backgroundColor = UIColor.red
UIScrollView.appearance(whenContainedInInstancesOf: [UIPresentationController.self]).backgroundColor = UIColor.clear
UITableView.appearance(whenContainedInInstancesOf: [UIPresentationController.self]).backgroundColor = UIColor.secondarySystemBackground
【讨论】:
无论如何都很有趣,但不幸的是,与@Mamaessen的答案存在相同的问题 您仍然可以根据您的期望自定义视图。以上是关于SwiftUI:如何将初始化程序分配给特定对象?的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 如何将@Published 分配给另一个@Published
SwiftUI + Combine:如何将数据分配给带有动画的模型
如何在 Swiftui 中根据彼此初始化 @State 变量?
如何将所有 memberOf 属性分配给 LDAP 中的特定用户