SwiftUI如何检测视图何时具有焦点?

SwiftUI如何检测视图何时具有焦点?,swiftui,Swiftui,我在视图中有两个列表,希望能够确定哪个列表当前具有焦点,以便在详细信息面板中显示列表中所选项目的正确详细信息 下面的代码似乎从未被调用过,是否有人能指出是否有其他正确的方法来确定焦点何时更改 struct StoreList: View { @EnvironmentObject private var database: Database @Binding var selectedStore: Store? var body: some View { L

我在视图中有两个列表,希望能够确定哪个列表当前具有焦点,以便在详细信息面板中显示列表中所选项目的正确详细信息

下面的代码似乎从未被调用过,是否有人能指出是否有其他正确的方法来确定焦点何时更改

struct StoreList: View {
    @EnvironmentObject private var database: Database
    @Binding var selectedStore: Store?

    var body: some View {
        List(selection: $selectedStore) {
            ForEach(database.stores, id: \.self) { store in
                StoreRow(store: store).tag(store)
                .focusable(true, onFocusChange:  { isFocused in
                    print("focus changed")
                        if isFocused {
                            self.database.selectedType = .store
                        }
                })
            }
        }
        .focusable(true, onFocusChange: { isFocused in
            print("focus changed")
                if isFocused {
                    self.database.selectedType = .store
                }
        })
    }
}
同时,我将探索如何检测鼠标在行上的点击,因为用户需要点击列表中的一个项目来移动焦点

当前,当视图模型(数据库)中的项目发生更改时(即$selectedStore),我正在设置selectedType值,但如果用户在其他列表中选择了已选择的项目,则该值不会得到更新,但列表和列表项确实获得了焦点-视觉颜色的更改表明它具有焦点

编辑:
我还尝试过处理ontapsignature回调,除了替换列表行的默认行为外,它工作得很好。我如何确保事件被传递到列表中,因为这可能会起作用

.focusable
(在AppKit中,它是KeyboardUI类别的一部分)仅适用于可以成为第一响应者的视图的键盘导航。一般来说,默认情况下,鼠标单击可能不会更改第一响应者,或者视图不会在鼠标单击时成为第一响应者。@Asperi谢谢,我想这是有意义的-因此我想知道当视图成为活动视图时,正确的检测方法是什么。据我所知,您的列表是相互排斥的,并且详细信息显示在一个列表或另一个列表中,因此该方法可以是在选择另一个列表项时清除(设置为nil)一个列表的选择,反之亦然。在SwiftUI中,我们必须使用状态(或模型),而不是视图。@Asperi一个列表有父对象,另一个有子对象,详细信息面板需要显示当前活动对象(父对象或子对象)的详细信息。所以用户可以选择一个父项,查看子项列表并选择一个子项。选择父项后,父项-子项将显示在子项列表中,父项详细信息将显示在详细信息面板中。选择子项后,子项的详细信息将显示在“详细信息”面板中。现在,如果用户再次单击父项,则需要在详细信息面板中显示父项详细信息。希望这是有意义的。
.focusable
(在AppKit中,它是KeyboardUI类别的一部分)仅适用于可以成为第一响应者的视图的键盘导航。一般来说,默认情况下,鼠标单击可能不会更改第一响应者,或者视图不会在鼠标单击时成为第一响应者。@Asperi谢谢,我想这是有意义的-因此我想知道当视图成为活动视图时,正确的检测方法是什么。据我所知,您的列表是相互排斥的,并且详细信息显示在一个列表或另一个列表中,因此该方法可以是在选择另一个列表项时清除(设置为nil)一个列表的选择,反之亦然。在SwiftUI中,我们必须使用状态(或模型),而不是视图。@Asperi一个列表有父对象,另一个有子对象,详细信息面板需要显示当前活动对象(父对象或子对象)的详细信息。所以用户可以选择一个父项,查看子项列表并选择一个子项。选择父项后,父项-子项将显示在子项列表中,父项详细信息将显示在详细信息面板中。选择子项后,子项的详细信息将显示在“详细信息”面板中。现在,如果用户再次单击父项,则需要在详细信息面板中显示父项详细信息。希望这是有意义的。