Ios SwiftUI NavigationLink高亮显示返回上一视图后保持高亮显示

Ios SwiftUI NavigationLink高亮显示返回上一视图后保持高亮显示,ios,swiftui,swiftui-list,swiftui-navigationlink,swiftui-navigationview,Ios,Swiftui,Swiftui List,Swiftui Navigationlink,Swiftui Navigationview,我在SwiftUI中有一系列视图。一种是“菜单视图”,它由导航链接的列表组成包装在导航视图中。 代码如下 var body: some View { NavigationView { List { HStack { NavigationLink(destination: History(), isActive: $isHistoryViewActive) {

我在SwiftUI中有一系列视图。一种是“菜单视图”,它由导航链接的列表组成包装在导航视图中。

代码如下

var body: some View {
        NavigationView {
            List {
                HStack {
                    NavigationLink(destination: History(), isActive: $isHistoryViewActive) {
                    Image(systemName: "clock")                        
                    Text("History")                    
                    }
                }
                
                HStack {
                    NavigationLink(destination: Settings(), isActive: $isSettingsActive) {
                        Image(systemName: "gear")
                        Text("Settings")
                    }
                }
                
                HStack {
                    Image(systemName: "info.circle.fill")
                    Button(action: {
                        ...
                    }) {
                        Text("My Button")
                    }
                }
            }
        }
   }
设置视图如下所示

var body: some View {
     List {
        ...
        Section(header: "Background Music") {
           Toggle("Play", isOn: $isBackGroundMusicOn)
        }
           
        Section(header: "Voice Setting") {
           HStack {
              NavigationLink(destination: VoiceList() {
                 Text(self.voiceNames[self.selectedVoice])
           }
        }
     }
}
最后,语音列表视图如下所示:

var body: some View {
        List {
            ForEach(0 ..< VoiceList.voiceNames.count) {voiceIndex in
                HStack {
                    Button(action: {
                        voiceChanged(selectedVoice: voiceIndex)
                    }){
                        Text(VoiceList.voiceNames[voiceIndex])
                    }
                    Spacer()
                    Image(systemName: "checkmark")
                        .frame(alignment: .trailing)
                        .foregroundColor(.blue)
                        .isHidden(hidden: voiceIndex != selectedVoice)
                }
            }
        }
}
var主体:一些视图{
名单{
ForEach(0..
我遇到的问题是,当应用程序从语音列表视图返回到设置视图时,导航链接将保持高亮显示,就像它仍然处于活动状态一样,如所附屏幕截图所示。我真的不知道是什么原因造成的。非常感谢您的任何想法或见解


我在使用列表时也遇到了同样的问题,为了解决这个问题,我使用了:
UITableViewCell.appearance().selectionStyle=.none
,但正如您所预料的那样,您将不具备选择功能,因此正确的方法是尝试存储选择状态并在离开屏幕之前进行清理,但在我的尝试中,我不知道如何做到这一点

例如:

struct YourApp: App {
    
    init() {
        UITableView.appearance().backgroundColor = .clear
        UITableViewCell.appearance().selectionStyle = .none
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

您可以在
列表上使用
onReceive
操作:

List {
    …
}.onReceive(NotificationCenter.default.publisher(for: UITableView.selectionDidChangeNotification)) {
    guard let tableView = $0.object as? UITableView,
          let selectedRow = tableView.indexPathForSelectedRow else { return }

    tableView.deselectRow(at: selectedRow, animated: true)
}
这将取消选择所选行


这个解决方案的最初想法归功于皮瓦桑(来自此)。

这对我来说不起作用。你把这行代码放在哪里了?在我的@main应用程序类中,我用这段代码创建了一个init()。我将编辑答案。不需要您案例的背景。谢谢您的回答。我的应用程序中实际上没有@main应用程序类。我想知道这是否可以放在SceneDelegate或HostingController中。否则,我会考虑创建一个应用程序类。如果您使用的是uikit生命周期,您也可以将其放入您的appDelegate中,不需要创建新项目。工作非常出色。非常感谢!这是我在Xcode 12.5中找到的唯一适合我的解决方案