Кнопки панели навигации иногда не нажимаются - PullRequest
0 голосов
/ 25 апреля 2020

У меня FavoritesView установлено с помощью навигационной кнопки BarItem для отображения SettingsView в качестве модального листа. Однако и эта кнопка, и кнопка Done на листе регистрируются и реагируют только на некоторые нажатия. Я не вижу никакой картины, когда кнопки будут реагировать, но иногда приложение может реагировать на 4 или 5 нажатий! Любой способ исправить это поведение?

FavoritesView:

import SwiftUI

enum ActiveSheet {
    case details, settings
}

struct FavoritesView: View {

    let speakers: [Speaker] = Bundle.main.decode("SpeakerTestData.json")

    @State private var selectedModel: Speaker?

    @State private var showingSheet = false
    @State private var activeSheet: ActiveSheet = .settings

    @EnvironmentObject var favorites: Favorites
    @EnvironmentObject var settings: UserSettings

    var filteredFavorites: [Speaker] {
        let allSpeakers = speakers
        var filteredItems: [Speaker] = []

        for entry in allSpeakers {
            if favorites.contains(entry) {
                filteredItems.append(entry)
            }
        }
        let sorted = filteredItems.sorted {
            $0.model.localizedStandardCompare($1.model) == .orderedAscending
        }
        return sorted
        }



    var body: some View {
        NavigationView {

            List {
                if filteredFavorites.count == 0 {
                    Text("Items you favourite will appear here.")
                        .foregroundColor(.secondary).padding(5)
                } else {
                Section(header: Text("Speakers")) {
                ForEach(filteredFavorites) { speaker in
                    HStack {

                    Button(action: {
                        self.activeSheet = .details
                        self.selectedModel = speaker
                        self.showingSheet = true
                    }) {
                        SpeakerModelRow(speaker: speaker).contentShape(Rectangle())
                    }
                    .buttonStyle(PlainButtonStyle())


                    Spacer()

                    Button(action: {
                        if self.favorites.contains(speaker) {
                            self.favorites.remove(speaker)
                        } else {
                            self.favorites.add(speaker)
                        }
                    }, label: {
                            if self.favorites.contains(speaker) {
                                Image(systemName: "star.fill")
                                .foregroundColor(.blue)
                                    .font(Font.title.weight(.ultraLight))
                            } else {
                                Image(systemName: "star")
                                .foregroundColor(.gray)
                                .font(Font.title.weight(.ultraLight))
                            }
                        }
                    ).padding(5)


                    }
                    }
                }
                }

            }
            .navigationBarTitle("Favourites")
        .navigationBarItems(trailing:
            Button(action: {
                self.activeSheet = .settings
                self.showingSheet = true
            }){
                Image(systemName: "gear").font(Font.title.weight(.ultraLight)).padding(.trailing, 5).foregroundColor(.primary)
        })
            .sheet(isPresented: self.$showingSheet) {
                if self.activeSheet == .details {
                    SpeakerDetailView(speaker: self.selectedModel!, showSheet: self.$showingSheet).environmentObject(self.favorites).environmentObject(self.settings)
                } else {
                    SettingsView(showSheet: self.$showingSheet).environmentObject(self.settings)
                }
        }

            }

    }

}

SettingsView представлен в виде листа:

struct SettingsView: View {

    @EnvironmentObject var settings: UserSettings
    @Binding var showSheet: Bool

    @State var result: Result<MFMailComposeResult, Error>? = nil
    @State var isShowingMailView = false


    var body: some View {
        NavigationView {
            VStack {

             //SettingsView Window


            }.navigationBarTitle("Settings")
            .navigationBarItems(leading: Button("Done") {
                self.showSheet = false
            })

        }
    }
}

1 Ответ

0 голосов
/ 25 апреля 2020

Это известная проблема, попробуйте использовать внутренние кнопки для заполнения содержимого (по умолчанию или более), например

.navigationBarItems(leading: Button(action: {
    self.showSheet = false
}) { Text("Done").padding() }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...