【问题标题】:How to reload the table view after dismissing a modal如何在关闭模式后重新加载表格视图
【发布时间】:2020-11-22 09:40:24
【问题描述】:

我目前在模态框上有用户输入数据并将其保存到 Core Data:

var container: NSPersistentContainer!

func saveContext() {
    if container.viewContext.hasChanges {
        do {
            try container.viewContext.save()
        } catch {
            print("An error occured whlie saving: \(error.localizedDescription)")
        }
    }
}

关闭模式后,我想在父视图控制器上重新加载表格。但是,无论我如何加载它,从 viewDidLoad 或 viewWillAppear,表格都不会重新加载。我知道数据已正确保存到 Core Data 中,因为当我重建时,数据会正确显示在表格中。

这是我想在关闭模式时触发的功能:

func loadSavedData() {
    if fetchedResultsController == nil {
        let request = Goal.createFetchRequest()
        let sort = NSSortDescriptor(key: "title", ascending: true)
        request.sortDescriptors = [sort]
        request.fetchBatchSize = 20
        
        fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: container.viewContext, sectionNameKeyPath: "title", cacheName: nil)
        fetchedResultsController.delegate = self
    }
    
    fetchedResultsController.fetchRequest.predicate = myPredicate
    
    do {
        try fetchedResultsController.performFetch()
        tableView.reloadData()
    } catch {
        print("Fetch failed")
    }
}

【问题讨论】:

    标签: ios swift uitableview core-data


    【解决方案1】:

    在Medium上发表的Sean Berry的article这个article,你可以详细了解viewWillAppear没有被调用的原因。

    然后,您可以使用闭包来了解您的模式何时被解除。

    将其添加到您的模态视图控制器中:

    var isDismissed: (() -> Void)?
    

    然后你可以在关闭控制器时调用它:

    self.isDismissed?()
    

    最后在展示视图控制器中,当你初始化你的modal时,你可以监听闭包,例如:

    let modalController = YourController()
    modalController.isDismissed = { [weak self] in
       self?.loadSavedData()
    }
    

    【讨论】:

    • 抱歉,我是 Swift 新手。 () -> Void) 是占位符吗?如果是,应该用什么代替它?此外,呈现视图控制器是 UITableViewController。我应该把modalController.isDismissed {}放在哪里?它会在同一个函数中实例化模态并呈现它吗?
    • 不用担心,关于您的第一个问题,请查看Swift docs,不,它不是占位符,通过文档您可以了解更多信息。对于第二个问题,是的,您必须将它放在您实例化并呈现您的模态的地方:)
    • 感谢您的回答。我正在模式中尝试dismiss(animated: true, completion: { self.isDismissed?() } ),但vc.isDismissed { [weak self] _ in self?.loadSavedData() } 给了我一个错误,上面写着Cannot call value of non-function type '(() -> Void)?
    • 我收到一个没有下划线的错误Argument passed to call that takes no arguments
    • @Kevvv 你是对的,从手机写我错过了。它是vc.isDismissed = { [weak self] in },在此块中,当您的模式将被解除时,您将收到回调。 () -> Void 闭包意味着我们没有参数作为输入或输出。
    猜你喜欢
    • 2012-04-30
    • 2020-09-28
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多