这又是一个让我怀疑了自己半天,然后最后发现是Apple本身的bug的事情=, =
这个bug是sheet弹出后,导航栏的按扭会失效而再次弹出sheet又会恢复的问题

重现

首先放了两个按扭(一个切换编辑模式,一个点击就变色)

.toolbar {
    ToolbarItem {
        EditButton()
    }
    ToolbarItem {
        Button(action: {
            isClicked.toggle()
        }) {
            Text("Click me")
                .foregroundColor(isClicked ? .red : .blue)
        }
    }
}

我先测试了两个按扭,都可以正常工作,然后编辑模式下弹出sheet再关闭后,两个按扭均不能点击了,再次弹出sheet后又都恢复了功能

这个问题我发现会出现在小屏的设备和模拟器,像14 pro max这样的大屏设备的模拟器就没有这种问题

另外如果在按扭不能用的时候时候下拉List一下,又可以正常点击按扭了,反正基本可以确定是Apple一个多年的bug (搜了一下几年前就有人提到这个问题了)

解决方式

解决也蛮简单EditButton().frame(height: 96, alignment: .trailing),这样用frame加一个高度就能解决这个问题了

额外的吐槽

sheet似乎经常出问题啊,上一次还遇到了它第一次出现时不能获得最新值的问题
不过解决也蛮简单,把视图从里面独立出去就能拿到值了

父结构{
	某个视图
	.sheet(isPresented: $isShowingThemeEditor) {
	    ThemeEditorView(selectedTheme: $selectedTheme, themes: $themes.themes)
	}
}
...
子结构
struct ThemeEditorView: View {
    @Binding var selectedTheme: ThemeChooser.Theme?
    @Binding var themes: [ThemeChooser.Theme]

    var body: some View {
        ThemeEditor(theme: $themes[selectedTheme!])
    }
}

参考

  1. Navigation bar button not clickable after sheet has been presented