这是我的模特
struct ListItemModel: Codable, Identifiable {
let id: String
let name: String
}
这是将与选择器一起显示的视图。该列表将由外部来源填充,但在此示例中,我对其进行了简化。
struct TypeSelectionView: View {
@State private var selected = 0
let testList = [ListItemModel(id: "11", name: "name1"),
ListItemModel(id: "12", name: "name2")]
var body: some View {
VStack {
Picker(selection: $selected, label: Text("Pick a Type")) {
ForEach(0 ..< testList.count) {
Text(testList[$0].name)
}
}.labelsHidden()
Picker(selection: $selected, label: Text("Pick a Type")) {
ForEach(testList) {type in
Text(type.name)
}
}.labelsHidden()
Text("Selected Type: \(testList[selected].name)")
Spacer()
}
}
}
struct TypeSelectionView_Previews: PreviewProvider {
static var previews: some View {
TypeSelectionView()
}
}
在第一选择器被正确地改变文字的页面上的显示时,选择器变化,但所述第二选择器没有。他们是否可以让第二个Picker做同样的事情,因为当您更改Picker时,Text视图将相应地更新 还是在SwiftUI中制作Pickers时应该一直使用的第一个Picker?
答案 0 :(得分:1)
第二个void MainWindow::paintEvent(QPaintEvent *event){
Q_UNUSED(event);
QRadialGradient grad(QPoint(this->width()/2,this->height()/2) , 50);
grad.setSpread(QGradient::RepeatSpread);
grad.setColorAt(0 , QColor(0,0,0));
grad.setColorAt(1 , QColor(100,100,100));
QPainter paint(this);
paint.setRenderHint(QPainter::Antialiasing , true);
QRectF r1(0,0,this->width(),this->height());
paint.drawRect(r1);
QBrush brush(grad);
paint.fillRect(r1 , brush);
...
...
}
不起作用的原因是Picker
返回的值对应于项目的Picker
。对于第二个id
,它们是Picker
。
您可以将String
应用于每个项目,然后.tag()
将返回该值。例如,如果您添加了一个明确的Picker
,它将可以正常工作:
tag
或者,如果将Text(type.name).tag(testList.firstIndex(where: { $0.id == type.id })!)
的值更改为id
,并且Int
的值与数组中的位置相对应,那么它将起作用。
由于实现id
的困难,很容易看出为什么许多开发人员选择仅迭代tag
。
答案 1 :(得分:0)
好吧,这是我对堆栈溢出问题的第一个答案,我本人还是一个新手,但希望我能有所帮助。
该代码放入Xcode时会显示两个选择器,其初始值为name1
,但是当您更改第一个选择器时,第二个选择器和显示所选类型的文本会相应更改,但是因为两个选择器共享相同的源@State private var selected = 0
,更改此设置将产生意想不到的副作用。
import SwiftUI
struct TypeSelectionView: View {
@State private var selected = 0
@State var testList = [ListItemModel(id: "11", name: "name1"),
ListItemModel(id: "12", name: "name2")]
@State var priorityTypes = ["low", "medium", "high", "critical"]
var body: some View {
VStack {
Picker("Pick a Type", selection: $selected) {
ForEach(0..<testList.count) {
Text(self.testList[$0].name)
}
}.labelsHidden()
Picker("Pick a Type", selection: $selected) {
ForEach(0..<testList.count) {
Text(self.testList[$0].name)
}
}.labelsHidden()
Text("Selected Type: \(testList[selected].name)")
Spacer()
}
}
}
struct TypeSelectionView_Previews: PreviewProvider {
static var previews: some View {
TypeSelectionView()
}
}
struct ListItemModel: Codable, Identifiable {
let id: String
let name: String
}