Кнопка SwiftUI неактивна внутри области элемента NavigationLink - PullRequest
0 голосов
/ 01 мая 2020

У меня есть вид элемента списка, который отображает некоторые новостные карточки в навигационной ссылке.

Я должен добавить кнопку «Нравится / Не нравится» в каждой новостной карточке навигационной ссылки, не переходя в 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")
                                }
                            }
                        }
                    }
                }
            }
        }
    }

В настоящее время действие кнопки (нравится / не нравится) не будет выполняться, поскольку при каждом нажатии кнопки навигационная ссылка переводит вас в окно назначения. Я пытался почти такой же вопрос , но он не может решить эту проблему.

Есть ли способ, который делает это возможным?

Спасибо.

1 Ответ

1 голос
/ 01 мая 2020

Этот код делает именно то, что вы хотите.

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 \($0 + 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)
                }
            }
        }
    }
  }
}
...