【发布时间】:2020-05-15 13:02:00
【问题描述】:
我有一个 SwiftUI 工作表视图,其中有一个处理 tcp 通信的 ObservedObject,当此工作表被关闭时,我需要它发送最后一条 tcp 消息,然后关闭套接字. onDisappear 事件似乎永远不会被触发(编辑:找到了罪魁祸首,因为我使用 UIHostingController 呈现工作表,仍然需要解决方案) 我已经尝试将它放在表单、导航视图中,尝试为其创建一个新堆栈,但没有任何效果。因此,我尝试使用我的 ObservedObject deinit,但是如果我在关闭视图后尝试快速重新打开视图,则会出现错误的访问错误。
deinit {
let msg = getUpdatedTimersString()
self.connection.sendMsg(msg, success: connection.close)
}
来自我使用Network Framework的连接类
func sendMsg(_ message: String, success: @escaping () -> Void = { }, error: @escaping () -> Void = { }) {
let msg = message + "\r\n"
let data: Data? = msg.data(using: .utf8)
debugPrint("Sending: \(msg)")
connection.send(content: data, completion: .contentProcessed { (sendError) in
if let sendError = sendError {
self.debug("\(sendError)")
error()
} else {
success()
}
})
}
func close() {
connection.cancel()
}
编辑:在下面添加视图代码
struct ScheduleView: View {
@ObservedObject var scheduleManager = ScheduleManager() // This handles the tcp communication, the deinit you see above is from this
var body: some View {
NavigationView {
Form {
ForEach(scheduleManager.timers) { timer in
ScheduleForm(scheduleManager: self.scheduleManager, timer: timer).onDisappear { debugPrint("schedule form row disappeared") } // This is just a view that adds a section header and a DatePicker to the form for each timer
}
}.onDisappear { debugPrint("form disappeared") }
.navigationBarTitle(Text("Schedule"), displayMode: .inline)
}.onDisappear() { debugPrint("nav disappeared") }
}
}
这些 onDisappear 都不适合我,ScheduleForm 行中的行是唯一一个甚至对我触发的行,但它会在创建工作表时触发每次我将一行滚动到视线之外,但在我关闭工作表时不会。
【问题讨论】:
-
什么会消除视图?它是否连接到它上面的某个绑定?
-
你需要显示你的工作表视图,你在哪里调用 onDisappear
-
@jnblanchard 其工作表视图可以通过滑动关闭
-
@ErnistIsabekov 我刚刚用视图代码更新了它
-
查看鳕鱼看起来没问题 onDisappear 应该在向下滑动时触发
标签: swift swiftui deinit network-framework