SwiftUI自定义ViewModifier实现列表单元格选中状态失效求助
解决SwiftUI自定义ViewModifier实现单元格选中状态不生效的问题
问题根源
你的ExpenseSelectableCell里错误地使用了@State var isSelected: Bool。@State是用来管理视图内部私有状态的,而这里的选中状态由父视图的selectedItem控制,属于外部传入的状态。用@State会把传入的值转为Modifier的局部状态,父视图状态变化时,Modifier无法感知到更新,自然不会刷新选中效果。
修复后的代码
把Modifier中的@State移除,直接用普通属性接收外部状态:
struct ExpenseSelectableCell: ViewModifier { let isSelected: Bool func body(content: Content) -> some View { content .overlay { Color.green.opacity(isSelected ? 0.2 : 0) } } } extension View { func selectableCell(isSelected: Bool) -> some View { self.modifier(ExpenseSelectableCell(isSelected: isSelected)) } }
修复原理
当父视图的selectedItem变化时,selectedItem == expense的结果会同步更新,selectableCell(isSelected:)会传入新的布尔值,触发Modifier的body重新计算,从而更新overlay的透明度,实现选中状态的实时切换。
关于“小题大做”的疑问
这完全不是小题大做。用ViewModifier封装选中效果,既能让单元格代码更简洁,又能将这个选中逻辑复用在其他视图中,完全符合SwiftUI组合式编程的设计思想,是合理的代码优化方式。
内容的提问来源于stack exchange,提问作者RafaSG13
相关产品推荐
相关产品推荐

