NavigationLink 项目区域内的 SwiftUI 按钮处于非活动状态

SwiftUI button inactive inside NavigationLink item area

我有一个列表项视图,它在导航链接中显示一些新闻卡片。

我应该在 navigationLink 的每个新闻卡片中添加一个 like/unlike 按钮,而不会被带到 NavigationLink.destination 页面。

它看起来像是一个大按钮中的一个小按钮。 当您单击那个小的时,执行小的而不执行大的。 (注意:点击区域被两个按钮覆盖,小的优先) (在javascript中,好像是.stopPropaganda)

这是我的代码:


    var body: some View {
        NavigationView {
            List {
                ForEach(self.newsData.newsList, id:\.self) { articleID in
                    NavigationLink(destination: NewsDetail(articleID: articleID)) {
                        HStack {
                            Text(newsTitle)

                            Button(action: {
                                self.news.isBookmarked.toggle()
                            }) {
                                if self.news.isBookmarked {
                                    Image(systemName: "bookmark.fill")
                                } else {
                                    Image(systemName: "bookmark")
                                }
                            }
                        }
                    }
                }
            }
        }
    }

目前,按钮操作 (like/dislike) 不会执行,因为无论何时按下按钮,navigationLink 都会将您带到目标视图。 我已经试过this almost same question,但还是不能解决这个问题。

有没有办法让这成为可能?

谢谢。

此代码完全符合您的要求。

struct Artcle {
  var text: String
  var isBookmarked: Bool = false
}

struct ArticleDetail: View {
  var article: Artcle
  var body: some View {
    Text(article.text)
  }
}

struct ArticleCell: View {
  var article: Artcle
  var toggle: () -> ()
  @State var showDetails = false
  var body: some View {
    HStack {
        Text(article.text)
        Spacer()
        Button(action: {
            self.toggle()
        }) {
            Image(systemName: article.isBookmarked ? "bookmark.fill" : "bookmark").padding()
        }
        .buttonStyle(BorderlessButtonStyle())
    }
    .overlay(
        NavigationLink(destination: ArticleDetail(article: article), isActive: $showDetails) { EmptyView() }
    )
    .onTapGesture {
        self.showDetails = true
    }
  }
}

struct ContentView: View {

  @State var articles: [Artcle]

  init() {
    _articles = State(initialValue: (0...10).map { Artcle(text: "Article \([=10=] + 1)") })
  }

  func toggleArticle(at index: Int) {
    articles[index].isBookmarked.toggle()
  }

  var body: some View {
    NavigationView {
        List {
            ForEach(Array(self.articles.enumerated()), id:\.offset) { offset, article in
                ArticleCell(article: article) {
                    self.toggleArticle(at: offset)
                }
            }
        }
    }
  }
}

从 XCode 12.3 开始,魔术是添加 .buttonStyle(PlainButtonStyle()) 或 BorderlessButtonStyle 到按钮,当所述按钮与列表中的 NavigationLink 位于同一行时。

如果没有这个特殊的咒语,整个列表行在按下按钮时被激活,反之亦然(按钮​​在 NavigationLink 被按下时被激活)。