我想在SwiftUI分段选择器中设置选定的分段颜色,并将文本颜色更改为白色。
我尝试将两种修饰符用于选择器视图,还尝试从外观代理中修改色调颜色。不幸的是,它们似乎都不起作用。
import SwiftUI
struct PickerView: View {
@State var pickerSelection = 0
init() {
UISegmentedControl.appearance().tintColor = UIColor.blue
}
var body: some View {
Picker(selection: $pickerSelection, label: Text("")) {
Text("Active").tag(0).foregroundColor(Color.white)
Text("Completed").tag(1)
}.pickerStyle(SegmentedPickerStyle()).foregroundColor(Color.orange)
}
}
Run Code Online (Sandbox Code Playgroud)
在SwiftUI中有什么方法可以做到这一点,还是应该通过UIViewControllerRepresentable使用UISegmentedControl?
我在 SwiftUI 和 Combine 中的内存管理方面遇到了一些问题。
例如,如果我有一个 NavigationView,然后导航到带有 TextField 的详细视图,并在 TextField 中输入一个值并点击后退按钮,则下次我转到该视图时,TextField 具有先前输入的值。
我注意到在细节视图被关闭后视图模型仍然在内存中,这可能是 TextField 仍然保留一个值的原因。
在 UIKit 中,当关闭 ViewController 时,视图模型将被释放,然后在 ViewController 出现时再次创建。这似乎不是这里的情况。
我为此问题附上了一些最低限度的可重现代码。
import SwiftUI
import Combine
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink(destination: OtherView()) {
Text("Press Here")
}
}
}
}
struct OtherView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
VStack {
TextField("Something", text: $viewModel.enteredText)
.textFieldStyle(RoundedBorderTextFieldStyle())
Button(action: {
print("Tap")
}) {
Text("Tapping")
}.disabled(!viewModel.isValid)
}
}
}
class ViewModel: ObservableObject …Run Code Online (Sandbox Code Playgroud) 我真的不明白使用模态时环境是如何工作的。看起来环境对于模态视图是分开的。
\n\n我使用核心数据制作了一个快速示例,并将对象保存到核心数据。如果我不通过环境,则不会保存对象,并且在尝试保存对象时出现以下错误:\n操作无法完成\xe2\x80\x99。(Foundation._GenericObjCError 错误 0。)
\n\n如果我在模式环境中传递托管对象上下文,它就会起作用。我注释掉了使它起作用的行。
\n\n任何人都可以解释为什么会发生这种情况吗?
\n\n\n @FetchRequest(fetchRequest: ToDoItem.fetchAllItems()) var items\n @Environment(\\.managedObjectContext) var managedObjectContext\n @State var showAddModal = false\n\n\n var body: some View {\n\n VStack {\n\n List(items, id: \\.name) { item in\n Text(item.name)\n }\n\n Button(action: {\n self.showAddModal.toggle()\n }) {\n Text("Add item")\n }.sheet(isPresented: $showAddModal) {\n ModalView()\n// .environment(\\.managedObjectContext, self.managedObjectContext)\n// It works if the managed object context is passed in the modal\'s environment\n }\n }\n }\n}\n\nstruct ModalView: View {\n\n @State var toDoItemName: String = ""\n @Environment(\\.presentationMode) var presentationMode\n @Environment(\\.managedObjectContext) …Run Code Online (Sandbox Code Playgroud)