【问题标题】:How can you reload a ViewController after dismissing a modally presented view controller in Swift?在 Swift 中关闭模态呈现的视图控制器后,如何重新加载 ViewController?
【发布时间】:2015-04-26 17:31:21
【问题描述】:

我有一个第一个 tableViewController,它在单击一个单元格时打开第二个 tableViewcontroller。第二个视图控制器以模态方式呈现(Show Detail segue)并被关闭:

self.dismissViewControllerAnimated(true, completion: {})

此时,第二个视图控制器滑开并显示其下方的第一个视图控制器。然后我想重新加载第一个视图控制器。我知道这可能需要使用委托函数,但不确定如何实现它

【问题讨论】:

  • 在您的UITableView 内部-viewDidAppear 上致电-reloadData

标签: ios xcode uitableview uiviewcontroller


【解决方案1】:

斯威夫特 5:

您可以访问正在呈现的 ViewController (presentingViewController) 属性,并在视图消失时使用它来重新加载表格视图。

class: FirstViewController {
    var tableView: UITableView

    present(SecondViewController(), animated: true, completion: nil)
}

在您的第二个视图控制器中,您可以在 viewWillDisappear 方法中,添加以下代码:

class SecondViewController {
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        if let firstVC = presentingViewController as? FirstViewController {
            DispatchQueue.main.async {
                firstVC.tableView.reloadData()
            }
        }
    }
}

当你关闭 SecondViewController 时,FirstViewController 的 tableview 将重新加载。

【讨论】:

  • 非常感谢,非常精确的解决方案,您拯救了我的一天
  • 在我的例子中,presentingViewController 是 SecondViewController。有什么建议吗?
【解决方案2】:

我的解决方法有点不同,因为我不想要那种依赖。

这种方法适用于您以模态方式呈现控制器时,因为当您关闭呈现的控制器时,呈现控制器不会重新加载。

无论如何解决!

相反,您创建一个单例(中介)

protocol ModalTransitionListener {
    func popoverDismissed()
}

class ModalTransitionMediator {
    /* Singleton */
    class var instance: ModalTransitionMediator {
        struct Static {
            static let instance: ModalTransitionMediator = ModalTransitionMediator()
        }
        return Static.instance
    }

private var listener: ModalTransitionListener?

private init() {

}

func setListener(listener: ModalTransitionListener) {
    self.listener = listener
}

func sendPopoverDismissed(modelChanged: Bool) {
    listener?.popoverDismissed()
}
}

你有没有像这样实现控制器的协议:

class PresentingController: ModalTransitionListener {
//other code
func viewDidLoad() {
    ModalTransitionMediator.instance.setListener(self)
}
//required delegate func
func popoverDismissed() {
    self.navigationController?.dismissViewControllerAnimated(true, completion: nil)
    yourTableViev.reloadData() (if you use tableview)
}
}

最后在您的 PresentedViewController 中的 viewDid/WillDisappear func 或自定义 func 中添加:

ModalTransitionMediator.instance.sendPopoverDismissed(true)

【讨论】:

    【解决方案3】:

    您可以简单地重新加载viewDidAppear: 中的数据,但这可能会导致在某些情况下不必要地刷新表。

    更灵活的解决方案是使用您猜对的协议。

    假设你的第一个 tableViewController 的类名是Table1VC,第二个是Table2VC。您应该定义一个名为Table2Delegate 的协议,该协议将包含一个方法,例如table2WillDismissed

    protocol Table2Delegate {
        func table2WillDismissed()
    }
    

    那么你应该让你的Table1VC 实例符合这个协议,并在你的委托方法的实现中重新加载你的表。

    当然,为了让它工作,你应该向Table2VC添加一个属性来保存委托:

    weak var del: Table2Delegate?
    

    并将其值设置为您的 Table1VC 实例。

    设置委托后,只需在调用 Table2VC 实例中的 dismissViewControllerAnimated 之前添加对委托方法的调用即可。

    del?.table2WillDismissed()
    self.dismissViewControllerAnimated(true, completion: {})
    

    这将使您可以精确控制何时重新加载表格。

    【讨论】:

    • 无论您使用哪种语言,操作系统的行为都是相同的。
    • 如果你在viewWillAppear中做会更好看;因为表格似乎已经加载。如果您在 viewDidAppear 中执行此操作;你会得到这张桌子,过一会儿它就会被加载。是的 swift 在关闭视图控制器后也会调用 viewWillAppear/viewDidAppear
    • override func viewDidAppear(_ animated: Bool) { // 我要执行的代码 } 非常适合我
    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多