Представление с ObservedObject и ничто не позволит мне редактировать его - PullRequest
1 голос
/ 20 апреля 2020

https://github.com/ryanpeach/RoutinesAppiOS

Средство выбора не будет двигаться, кнопка редактирования не будет щелкать, а в текстовое поле не будет входить более 1 символа. Возврат на клавиатуре не работает. Большинство из них связаны с привязками к ObservedObject и должны иметь возможность напрямую редактировать его. Я считаю, что есть общая причина, когда CoreData висит на обновлениях объектов. Кнопка «Готово» на финальном экране проигрывателя зависает, а кнопка «Пропустить» - нет! Это означает, что это происходит только при обновлении TaskData. Если вы удаляете сигнал тревоги в определенных ситуациях, приложение тоже падает.

Ниже приведено видео о поведении приложения. В представлении прямо до конца ничего не будет щелкать. В конечном виде он зависает, когда вы нажимаете галочку.

https://www.icloud.com/photos/#0HMiYqZ08ZYoFu5BEQXET4gRA

Я ищу несколько советов о том, как отладить эту ошибку. Я не могу поставить точку останова на сборщике «когда что-то меняется», и я так же не могу сделать это в текстовом поле. Почему текстовое поле принимает только один символ, а затем останавливается? Почему кнопка редактирования не работает? Это единственное представление в приложении, где эти вложенные представления не работают, остальная часть приложения работает нормально.

Некоторая соответствующая справочная информация:

Я использую coredata. Существует 3 класса: AlarmData для страницы процедур, которая имеет отношение one2many к TaskData для страницы TaskList, которая имеет отношение one2many к SubTaskData для страниц TaskPlayerView и TaskEditor, с которыми у меня возникают проблемы.

Больше никаких связей.

Я делаю запрос на выборку в представлении root, а затем использую @ObservedObject до конца иерархии представления. Я использую в основном isActive и tag: selection NavigationLinks.

Соответствующий файл:

struct TaskEditorView: View {
    @Environment(\.managedObjectContext) var managedObjectContext

    @ObservedObject var taskData: TaskData
    @State var newSubTask: String = ""

    var subTaskDataList: [SubTaskData] {
        var out: [SubTaskData] = []
        for sub_td in self.taskData.subTaskDataList {
           out.append(sub_td)
       }
       return out
   }

    var body: some View {
        VStack {
            TitleTextField(text: self.$taskData.name)
            Spacer().frame(height: DEFAULT_HEIGHT_SPACING)
            TimePickerRelativeView(time: self.$taskData.duration)
            Spacer().frame(height: DEFAULT_HEIGHT_SPACING)
            HStack {
                Spacer().frame(width: DEFAULT_LEFT_ALIGN_SPACE, height: DEFAULT_HEIGHT_SPACING)
                ReturnTextField(
                    label: "New Subtask",
                    text: self.$newSubTask,
                    onCommit: self.addSubTask
                )
                Button(action: {
                    self.addSubTask()
                }) {
                    Image(systemName: "plus")
                        .frame(width: DEFAULT_LEFT_ALIGN_SPACE, height: 30)
                }
                Spacer().frame(width: DEFAULT_HEIGHT_SPACING)
            }
            Spacer().frame(height: DEFAULT_HEIGHT_SPACING)
            Text("Subtasks:")
            Spacer().frame(height: DEFAULT_HEIGHT_SPACING)
            List {
                ForEach(self.subTaskDataList, id: \.id) { sub_td in
                    Text(sub_td.name)
                }
                .onDelete(perform: self.delete)
                .onMove(perform: self.move)
            }
        }
        .navigationBarItems(trailing: EditButton())
    }

    ...

}

Также не нравится, когда его редактируют здесь (см. Комментарий FLAG):

struct TaskPlayerView: View {
    @Environment(\.managedObjectContext) var managedObjectContext

    var taskDataList: [TaskData] {
        return self.alarmData.taskDataList
    }

    var taskData: TaskData {
        return self.taskDataList[self.taskIdx]
    }

    var subTaskDataList: [SubTaskData] {
        var out: [SubTaskData] = []
        for sub_td in self.taskData.subTaskDataList {
            out.append(sub_td)
        }
        return out
    }

    @ObservedObject var alarmData: AlarmData
    @State var taskIdx: Int = 0

    // For the timer
    let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    @State var isPlay: Bool = true
    @State var done: Bool = false
    @State var startTime: Date?
    @State var lastTime: Date = Date()
    @State var durationBeforePause: TimeInterval = 0
    @State var durationSoFar: TimeInterval = 0

    var body: some View {
        VStack {
            if !self.done {
                ...
                HStack {
                    Spacer()
                    Button(action: {
                        withAnimation {
                            if self.subTaskDataList.count == 0 || self.subTaskDataList.allSatisfy({$0.done}) {
                                // FLAG: It fails here where setting task data
                                self.taskData.lastDuration_ = self.durationSoFar
                                self.taskData.done = true
                                self.taskData.lastEdited = Date()
                                self.next()
                            }
                        }
                    }) {
                        if self.subTaskDataList.count == 0 || self.subTaskDataList.allSatisfy({$0.done}) {
                            Image(systemName: "checkmark.circle")
                                .resizable()
                                .frame(width: 100.0, height: 100.0)
                        } else {
                            Image(systemName: "checkmark.circle")
                                .resizable()
                                .frame(width: 100.0, height: 100.0)
                                .foregroundColor(Color.gray)
                        }
                    }
                    Spacer()
                }
           ...
        }
        ...
    }

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...