[问题描述]
在编辑的form中,需要增加一个Picker进行选择Note关联的List,尝试如下

struct NoteDetailView: View {
	let note: NoteViewModel
	let categoryList : [CategoryViewModel]
	@State private var noteViewState = NoteViewState()
	var body: some View {
		Picker(selection: $noteViewState.categoryId, label: Text("列表")) {
            		ForEach(self.categoryList, id: \.categoryId) { category in
                		HStack{
                    			CategorySimpleInfoRow(category: category)
                		}.tag(category.categoryId)
            		}//: ForEach
        	}//:Picker
		.onAppear {
                	// init data
                	self.noteViewState.categoryId = self.note.cateogryId

            	}
	}

}

看起来没有问题,但是在选择列表后,并不能变更noteViewState.categoryId的值,效果如下:

查询了相关资料后,依然无法解决onAppear时初始化值后,在picker中无法变更值的问题,后只能另辟蹊径。

20210228补充:
今天突然意识到,其实是在选择完毕后,返回上级页面是,重新调用了OnAppear方法,导致重新执行了OnAppear中的逻辑(赋值self.noteViewState.categoryId

【解决方案】
经过测试发现,在onAppear中初始化,Picker无法编辑生效,但是在页面加载完成后进行赋值,可以起作用。所以增加点击“编辑”按钮的动作,在点击按钮时进行赋值。
代码则是在上述代码基础上,增加了按钮并且在按钮的action中对noteViewState.categoryId进行赋值。

20210228补充:
既然找到了问题所在(选择完毕后,返回页面是重新调用了OnAppear方法),那解决方案也就出来了。

  1. 初始化一个计数器
  2. 在onAppear中判断,如果初次加载,则初始化变量

@State var appearCount = 0
...
.onAppear(){
                    if(appearCount==0){
                    self.addState.categoryId = self.categoryList.first?.categoryId ?? ""
                    }
                    self.appearCount = self.appearCount + 1
                }