Ios 更新MasterViewController时如何刷新DetailViewController

Ios 更新MasterViewController时如何刷新DetailViewController,ios,swift,uisplitviewcontroller,Ios,Swift,Uisplitviewcontroller,我有一个应用程序,用户可以在其中更新和添加任务。但是当用户更新任务时,我需要更新DetailViewController中的详细信息 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showDetail" { if let indexPath = tableView.indexPathForSelectedRow { let object =

我有一个应用程序,用户可以在其中更新和添加任务。但是当用户更新任务时,我需要更新DetailViewController中的详细信息

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
   if let indexPath = tableView.indexPathForSelectedRow {
       let object = fetchedResultsController.object(at: indexPath)
       let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
                controller.details = object;
                controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
                controller.navigationItem.leftItemsSupplementBackButton = true
                detailViewController = controller
            }
    }
}
func editEvents(_ sender: Any){
        let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Proj")

        do {
            let test = try context.fetch(fetchRequest)

            var objectUpdate = test[0] as! Assesment;


            objectUpdate.name = txtname.text ?? ""
            objectUpdate.code = txtCode.text ?? "";

            do {
                try context.save()

            }
            catch {
                print(error)
            }
        }
        catch {
            print(error)
        }
    }
当用户更新任务并将数据保存在MasterViewController中,但DetailViewController中的数据保持不变时

我如何修复它,使细节也得到更新

使用添加项目控制器添加和编辑任务

我尝试了以下方法,但没有一种有效,所有这些都会导致应用程序崩溃

 let vc = DetailViewController()
 let row = vc.view.layoutIfNeeded();

//Second method

let vc = MasterViewController() 
vc.performSegue(withIdentifier: "showDetail", sender: vc.self)

使用在DetailViewController中设置数据

  override func viewDidLoad() {
        super.viewDidLoad()
        table.delegate = self
        table.dataSource = self

        lblName.text = detail.name ?? ""
        lblCode.text = detail.code ?? ""     
    }
主视图控制器

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
   if let indexPath = tableView.indexPathForSelectedRow {
       let object = fetchedResultsController.object(at: indexPath)
       let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
                controller.details = object;
                controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
                controller.navigationItem.leftItemsSupplementBackButton = true
                detailViewController = controller
            }
    }
}
func editEvents(_ sender: Any){
        let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Proj")

        do {
            let test = try context.fetch(fetchRequest)

            var objectUpdate = test[0] as! Assesment;


            objectUpdate.name = txtname.text ?? ""
            objectUpdate.code = txtCode.text ?? "";

            do {
                try context.save()

            }
            catch {
                print(error)
            }
        }
        catch {
            print(error)
        }
    }
编辑视图控制器

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
   if let indexPath = tableView.indexPathForSelectedRow {
       let object = fetchedResultsController.object(at: indexPath)
       let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
                controller.details = object;
                controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
                controller.navigationItem.leftItemsSupplementBackButton = true
                detailViewController = controller
            }
    }
}
func editEvents(_ sender: Any){
        let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Proj")

        do {
            let test = try context.fetch(fetchRequest)

            var objectUpdate = test[0] as! Assesment;


            objectUpdate.name = txtname.text ?? ""
            objectUpdate.code = txtCode.text ?? "";

            do {
                try context.save()

            }
            catch {
                print(error)
            }
        }
        catch {
            print(error)
        }
    }
func editEvents(\uSender:Any){
let fetchRequest:NSFetchRequest=NSFetchRequest(entityName:“Proj”)
做{
let test=try context.fetch(fetchRequest)
var objectUpdate=test[0]as!assessment;
objectUpdate.name=txtname.text??“”
objectUpdate.code=txtCode.text;
做{
尝试context.save()
}
抓住{
打印(错误)
}
}
抓住{
打印(错误)
}
}
我想在editEvent函数完成执行后更新详细信息


如果您使用的是coreData,是否还有其他方法可以实现此功能?

。。您可以详细实施FRC。。所以每次在回调中都会得到刷新的数据

MasterViewController
中定义一个变量

这是另一个解决方法

private var controller : DetailViewController? = nil
然后在你的Segue方法中使用这个控制器

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
   if let indexPath = tableView.indexPathForSelectedRow {
       let object = fetchedResultsController.object(at: indexPath)
       self.controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController // here you set your instence variable controller
                controller.details = object;
                controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
                controller.navigationItem.leftItemsSupplementBackButton = true
                detailViewController = controller
            }
    }
}


func editEvents(_ sender: Any){
        let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Proj")

        do {
            let test = try context.fetch(fetchRequest)

            var objectUpdate = test[0] as! Assesment;


            objectUpdate.name = txtname.text ?? ""
            objectUpdate.code = txtCode.text ?? "";



            do {
                try context.save()
                if let detailsCotrollerExists = controller {
                 detailsCotrollerExists.updateDataWithObject(objectUpdate) // function you will write in detail class which takes object and refresh data there .. Either outlets or Table/Collection View reload
                }
            }
            catch {
                print(error)
            }
        }
        catch {
            print(error)
        }
    }

您需要使用闭包或委托进行消息传递