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()
}
...
}
...
}
...
}