【问题标题】:Swift: When Does the Completion Block of Dismiss View Get Executed?Swift:Dismiss View 的完成块什么时候执行?
【发布时间】:2017-02-17 22:40:34
【问题描述】:

关闭视图的完成块何时执行? 是在用户看到视图被关闭之后还是之前?

我有这段代码在完成块内制作带有消息的祝酒词,但在此视图关闭后再也看不到祝酒词。

       self.dismiss(animated: true, completion: {
       self.view.makeToast(message: "Employee has been assigned successfully.", duration: 2.0, position: HRToastPositionCenter as AnyObject, title: "Succeeded!")
})

我想要的是当视图完全关闭时用户可以看到吐司?

我该怎么做?

【问题讨论】:

  • 您可以将事件从呈现的控制器委托给父级并在那里处理(dismiss and makeToast)

标签: ios iphone swift


【解决方案1】:

您可以将事件从呈现的控制器委托给父级并在那里处理。

在 EmployeePickerViewController(或任何你的模态控制器)中:

@protocol EmployeePickerDelegate {
    func employeeAssigned()
}

class EmployeePickerViewController {
    weak delegate: EmployeePickerDelegate!
}

当员工分配完成后,只需调用委托的方法:

delegate?.employeeAssigned()

模态显示时在 MainViewController 中:

employeePicker.delegate = self
present(employeePicker, animated: true, completion: nil)

在MainViewController下面:

extension MainViewController: EmployeePickerDelegate {
   func employeeAssigned {
       dismiss(animated: true, completion: {
            self.view.makeToast(message: "Employee has been assigned successfully.", duration: 2.0, position: HRToastPositionCenter as AnyObject, title: "Succeeded!")
       })
   }
}

【讨论】:

    【解决方案2】:

    对于 UIViewController.dismiss(animated:completion:)

    在 viewDidDisappear(_:) 方法之后调用完成处理程序 在呈现的视图控制器上调用。

    Source

    对于 UIViewController.present(_:animated:completion:)

    在 viewDidAppear(_:) 方法完成后调用完成处理程序 在呈现的视图控制器上调用。

    Source.


    如果你不知道那是什么时候,这是 UIViewController 加载、出现和消失方法的顺序

    1. viewDidLoad

    通常我们初始化数据对象和控件。它将创造所有 此视图的所有控件/数据对象所需的内存。 IE。 在上述情况下,anotherView 和 btnView,它们将保持相同 整个生命周期的内存地址。

    1. viewWillAppear

    在视图添加到窗口的视图层次结构之前调用。所以 非常适合更新视图控制器的数据。

    1. viewDidAppear

    在视图添加到窗口的视图层次结构后调用。

    1. viewWillDisappear

    在视图从窗口的视图层次结构中移除之前调用。

    1. viewDidDisappear

    在视图从窗口的视图层次结构中移除后调用。

    Source

    【讨论】:

      【解决方案3】:

      您正在调用对 self 的驳回,因此对它的每个引用都将是 dealloc。我猜你的self.view 已经不存在了。

      【讨论】:

      • self.view 仍然存在,因为它被强烈捕获
      • 尝试在你的 self.view.makeToast() 行添加断点,此时检查实体
      【解决方案4】:

      完成块在视图控制器被解除后执行。这意味着您的视图不再出现在屏幕上。我认为您想在该视图中渲染吐司,这是不可能的,因为它不在屏幕上。

      【讨论】:

        【解决方案5】:

        toast 将显示在您已关闭的视图中。由于视图消失了,您将看不到它的吐司。您可能希望在关闭视图后出现的以下屏幕中显示 toast。

        【讨论】:

        • 谢谢,但是如何将 toast 从当前视图显示到下一个视图
        • 你是如何呈现你现在正在摒弃的观点的?
        【解决方案6】:

        也许在窗口上显示 toast 比在特定视图上显示更容易?

           UIApplication.shared.keyWindow?.makeToast(message: "Employee has been assigned successfully.", duration: 2.0, position: HRToastPositionCenter as AnyObject, title: "Succeeded!")
        

        【讨论】:

          猜你喜欢
          • 2011-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-03
          相关资源
          最近更新 更多