如何关闭以上下文ForSegue呈现的WKInterface控制器?



我有一个带有WKInterfaceTableWKInterfaceController,其中列出了用户在我的应用程序中记录的一些事件。

用户可以点击表格的某一行以查看有关该事件的更多详细信息。为此,我在包含表的WKInterfaceController上覆盖了contextForSegue(withIdentifier:in:rowIndex:),因此点击一行会以模式方式在名为EventDetailController的新WKInterfaceController中显示该行的详细信息视图。

modal演示文稿在情节提要上定义。我无法使用push演示文稿,因为带有WKInterfaceTableWKInterfaceController是应用顶层多个WKInterfaceController实例中的页面。

这是主要问题:

EventDetailController中,有一个">删除">按钮用于销毁表行表示的记录。

当用户点击"删除"按钮时,我会显示一条警报,允许用户确认或取消删除操作。

用户确认删除记录后,我想关闭该EventDetailController,因为它不再相关,因为它表示已删除的记录。

以下是在点击">删除"按钮时调用的EventDetailController上定义的IBAction

@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])
}

问题是watchOS似乎不允许这样做。测试此代码时,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:)调用,但我不知道它是什么。

当我直接在IBAction中调用dismiss()而不是在WKAlertAction处理程序中时,它工作正常,但我不喜欢这种实现,因为它不允许用户先确认操作。

我觉得自己像个白痴,但我想出了解决方案。

答案一直在Apple的WKInterfaceController.dismiss()文档中(着重号是加的(:

如果要关闭以模式方式提供的接口控制器,请调用此方法。始终从 WatchKit 扩展的主线程调用此方法。

我所要做的就是在主线程上调用self.dismiss()

这是我更新的删除操作代码,它现在按预期工作:

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

希望这将为其他人节省一些故障排除时间!

相关内容

  • 没有找到相关文章

最新更新