我在LazyVGrid中有ScrollView。里面有出现的forEach循环创建视图。用户可以在此scrollView中创建新项目。当使用ScrollViewReader创建新视图时,我观察到自定义Bool属性的更改,该属性使用
.onChange(of: boolProperty) { _ in
withAnimation {
reader.scrollTo(viewModel.items.[0].id, anchor: .top)
}
}
字符串
一切正常,但如果我像这样将[0]
更改为.first
,
.onChange(of: boolProperty) { _ in
withAnimation {
reader.scrollTo(viewModel.items.first?.id, anchor: .top)
}
}
型
行为是不一样的,视图只滚动一点点,而不是顶部
2条答案
按热度按时间qco9c6ql1#
first
返回一个可选类型(当数组为空时返回nil),因此viewModel.items.first?.id
的类型为ID?
,其中ID
的类型为id
。另一方面,
viewModel.items.[0].id
是非可选类型ID
。下标返回非可选类型,并在数组为空时崩溃。scrollTo
滚动到滚动视图中的一个视图,该视图具有您指定的ID。您的视图可能具有 non-optional ID,因此传递一个可选类型的值将永远不会匹配您拥有的任何视图,因此不会滚动到所需的视图。jecbmhm32#
这是不同的,
items[0].id
是non-optinal的,也就是说,一个Int
。而items.first?.id
是相反的,Optional<Int>
。基本上,它不会匹配,这就是为什么滚动不工作。试试这个:字符串