我如何解散由contextForSegue呈现的WKInterfaceController?

时间:2018-08-19 21:50:56

标签: watchkit watch-os wkinterfacetable wkinterfacecontroller

我有一个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()时,它可以正常工作,但是我不喜欢这种实现,因为它不允许用户先确认操作。

1 个答案:

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

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