我有一个WKInterfaceController
和一个WKInterfaceTable
,其中列出了用户在我的应用中记录的一些事件。
用户可以点击表格的一行以查看有关该事件的更多详细信息。为此,我在包含该表的contextForSegue(withIdentifier:in:rowIndex:)
上覆盖了WKInterfaceController
,因此,以模式方式点按一行可在名为{{1}的新WKInterfaceController
中显示该行的详细视图。 }。
EventDetailController
演示文稿是在情节提要上定义的。我无法使用modal
演示文稿,因为带有push
的{{1}}是应用程序顶层WKInterfaceController
的多个实例之间的页面。
在WKInterfaceTable
中,有一个 Delete (删除)按钮来销毁表行代表的记录。
当用户点击删除按钮时,我会显示一条警报,允许用户确认或取消删除操作。
用户确认记录删除后,我想关闭WKInterfaceController
,因为它不再相关,因为它代表已删除的记录。
以下是在EventDetailController
上定义的EventDetailController
,当您点击 Delete 按钮时会被调用:
IBAction
问题在于watchOS似乎不允许这样做。测试此代码时,EventDetailController
不会关闭。而是在控制台中记录了一条错误消息:
@IBAction func deleteButtonTapped(_ sender: WKInterfaceButton) {
let deleteAction = WKAlertAction(title: "Delete", style: .destructive) {
// delete the record
// as long as the delete was successful, dismiss the detail view
self.dismiss()
}
let cancelAction = WKAlertAction(title: "Cancel", style: .cancel) {
// do nothing
}
presentAlert(withTitle: "Delete Event",
message: "Are you sure you want to delete this event?",
preferredStyle: .alert,
actions: [deleteAction, cancelAction])
}
我尝试了一些怪异的变通办法来尝试诱使EventDetailController
处于关闭状态,例如在事件被删除时触发通知,并从被观察者调用的函数中关闭[WKInterfaceController dismissController]:434: calling dismissController from a WKAlertAction's handler is not valid. Called on <Watch_Extension.EventDetailController: 0x7d1cdb90>. Ignoring
通知,但这也不起作用。
在这一点上,我正在考虑应该采用某种正确的方法来消除EventDetailController
,或者换句话说,撤消EventDetailController
的电话,但我不知道该怎么办是的。
当我直接在WKInterfaceController
中而不是在contextForSegue(withIdentifier:in:rowIndex:)
处理程序中调用dismiss()
时,它可以正常工作,但是我不喜欢这种实现,因为它不允许用户先确认操作。
答案 0 :(得分:4)
我觉得自己是个白痴,但我想出了办法。
答案一直在苹果公司的WKInterfaceController.dismiss()
文档中(强调):
当您要关闭模态显示的接口控制器时,请调用此方法。 始终从WatchKit扩展程序的主线程调用此方法。
我要做的就是改变主线程的调用self.dismiss()
。
这是我为delete动作更新的代码,该代码现在可以正常运行:
let deleteAction = WKAlertAction(title: "Delete", style: .destructive) {
// delete the record
// as long as the delete was successful, dismiss the detail view
DispatchQueue.main.async {
self.dismiss()
}
}
希望这将为其他人节省一些故障排除时间!