Сбой приложения при попытке отобразить лист поверх просмотра при использовании SwiftUI

Я пытаюсь представить представление другого представления в SwiftUI, используя .sheet (). Когда это запускается, мое приложение вылетает без трассировки стека даже при запуске на симуляторе, и отображается эта ошибка:

    EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

Я уже определил, что представленное представление не является проблемой, попытавшись представить текст («Тест») вместо моего настраиваемого представления, но я все равно получаю ту же ошибку.

.sheet(isPresented: self.$isPresenting) { () -> Text in
    return Text("This is a test")
 }

Это код, который устанавливает представление и пытается представить другое представление при нажатии зеленой кнопки. На устройстве это выглядит так:

введите здесь описание изображения

struct WeekView: View {

    @ObjectBinding var currentMealPlan = MealPlan(totalMealExchanges: 0, totalGraciesMeals: 0)
    @State var isPresenting = false
    var body: some View {

        NavigationView{
        VStack{


            VStack(alignment: .leading){
                Text("Meals at Gracies remaining: ?/\(currentMealPlan.totalGraciesMeals)")
                Text("Meal Exchanges Remaining: ?/\(currentMealPlan.totalMealExchanges)")
            }



            List{
                Section(header: Text("Monday")) {
                    HStack{


                        MealView(meal: "Breakfast", location: "Dorm ", color: Color.green)
                            .tapAction {
                                self.isPresenting.toggle()

                        }
                        .sheet(isPresented: self.$isPresenting) { () -> Text in
                                    return Text("This is a test")
                                }



                        MealView(meal: "Lunch", location: "Gracies", color: Color.blue)
                        MealView(meal: "Dinner", location: "Salsarita", color: Color.yellow)



                    }
                }


  Section(header: Text("Tuesday")) {
                    Text("Hello World")

                }

                Section(header: Text("Wednesday")) {
                    Text("Hello World")

                }

                Section(header: Text("Thursday")) {
                    Text("Hello World")

                }
                Section(header: Text("Friday")) {
                    Text("Hello World")

                }

                Section(header: Text("Saturday")) {
                    Text("Hello World")

                }

                Section(header: Text("Sunday")) {
                    Text("Hello World")

                }


            }

 }.navigationBarTitle("This Week")
            .navigationBarItems(trailing: Button(action: {

            }, label: {
                Text("Help")
            }))

    }

    }
}





struct MealView: View {
    @State var meal: String
    @State var location: String
    @State var color: Color
    @State private var showPopover = false

    var body: some View {
        ZStack{
            Rectangle()
                .fill(color)
            VStack{
                Text(meal)
                    .bold()
                Text(location)
                    .lineLimit(2)
                    }


        }
    }}
class MealPlan: BindableObject   {

    let willChange =  PassthroughSubject<Void, Never>

    var totalMealExchanges: Int {didSet {willChange.send()}}
    var totalGraciesMeals: Int {didSet {willChange.send()}}

    init(totalMealExchanges: Int, totalGraciesMeals: Int) {
        self.totalGraciesMeals = totalGraciesMeals
        self.totalMealExchanges = totalMealExchanges
    }

}


person Lontronix    schedule 25.07.2019    source источник
comment
EXC_BAD_INSTRUCTION обычно происходит, потому что компилятор ожидает найти что-то, где ничего нет. Возможно, вы принудительно разворачиваете ноль, может быть индекс массива за пределами границ, может быть, что вы ссылаетесь на что-то, что было недавно освобождено ARC или иным образом. Это 3 распространенные причины   -  person Cameron Porter    schedule 25.07.2019
comment
Спасибо за ответ! Я подумал, что это может быть случай, который является частью причины, по которой я попытался представить простую метку вместо своего настраиваемого представления (где я декодирую JSON и добавляю значения в массив), но у меня все еще есть проблема. Я не уверен, что может быть освобождено, поскольку я использую SwiftUI Views и @State vars, оба из которых SwiftUI должен обрабатывать за кулисами (по крайней мере, я понимаю, как это работает).   -  person Lontronix    schedule 25.07.2019
comment
Вы должны добавить свою MealPlan реализацию в свой пост, иначе мы не сможем воспроизвести проблему. Если мы не можем воспроизвести, то невозможно точно определить, откуда произошел сбой. Если вы не можете раскрыть свой MealPlan, попробуйте сократить его реализацию до минимума. В процессе сбой может исчезнуть, и вы лучше поймете, откуда взялась проблема.   -  person kontiki    schedule 25.07.2019
comment
@kontiki только что добавил класс MealPlan в конец сообщения   -  person Lontronix    schedule 25.07.2019


Ответы (3)


Пробовал на симуляторе (iPhone Xr), не вылетает. Я использую Xcode 11 Beta 4. Каковы ваши настройки?

Но я заметил кое-что не так. Вы вызываете willChange в didSet, но вам действительно следует вызвать его до того, как это изменение будет внесено в willSet. Вам следует изменить:

var totalMealExchanges: Int {didSet {willChange.send()}}
var totalGraciesMeals: Int {didSet {willChange.send()}}

to:

var totalMealExchanges: Int {willSet {willChange.send()}}
var totalGraciesMeals: Int {willSet {willChange.send()}}
person kontiki    schedule 25.07.2019
comment
Спасибо, что указали на проблему с willSet :), я только что исправил эту проблему по вашей рекомендации. Я также использую Xcode 11 beta 4 и тестирую приложение в симуляторе iPhone XR. Поскольку приложение не аварийно завершилось для вас, модальное окно присутствовало или ничего не произошло? - person Lontronix; 25.07.2019
comment
Да, присутствует. - person kontiki; 25.07.2019
comment
вау, это действительно странно. Вы только что скопировали код, который я ввел в вопросе? - person Lontronix; 25.07.2019
comment
Да, я скопировал и вставил. Я также исправил willSet и добавил недостающую круглую скобку в PassthroughSubject<Void, Never>(). - person kontiki; 25.07.2019
comment
Я тоже пробовал это, и он есть, но я не упомянул разделы-заполнители в моем сообщении Stackoverflow (заголовки, в которых есть ячейка, которая просто говорит привет, мир). Что странно, приложение работает нормально, когда у меня есть 4 раздела-заполнителя (2 прокомментированы), но когда все 6 не прокомментированы, приложение вылетает. Я обновил сообщение, добавив в него неиспользуемые заголовки разделов, поскольку кажется, что они связаны с проблемой. - person Lontronix; 25.07.2019
comment
Если ваш любопытный комментарий закомментирует два нижних заголовка раздела (суббота и воскресенье), вы увидите, что приложение не вылетает. но когда они не прокомментированы, приложение вылетает. Это действительно странно, потому что я пытался сделать это в примере проекта, но не могу воспроизвести проблему. - person Lontronix; 25.07.2019
comment
на самом деле это похоже на ошибку swiftUI, я просто смог воспроизвести проблему в образце проекта. Шесть заголовков разделов в списке внутри NavigationView вызывают сбой приложения. - person Lontronix; 25.07.2019
comment
Да, подтверждаю, теперь могу воспроизвести. Пора сообщить об ошибке в Apple, тогда: - | - person kontiki; 25.07.2019
comment
да, только что подал радар (FB6818276), тем не менее, спасибо за вашу помощь! - person Lontronix; 25.07.2019
comment
Я сделаю то же самое и назову ваш номер два. Ваше здоровье. - person kontiki; 25.07.2019

Это оказалось ошибкой в ​​SwiftUI. Если список встроен в представление навигации и имеет 6 или более разделов, приложение выйдет из строя при попытке представить лист (FB6818276)

person Lontronix    schedule 25.07.2019

Я не тестировал это, но у меня были лучшие результаты с .sheet, если прикрепить его к родительскому представлению. Попробуйте переместить его так, чтобы он был модификатором внешнего VStack вместо MealView.

person SarahR    schedule 25.07.2019
comment
только что попробовал, к сожалению, приложение все еще вылетает. Хотя спасибо за рекомендацию - person Lontronix; 25.07.2019