【问题标题】:Dismissing Pushed view controller without NavigationController关闭没有 NavigationController 的推送视图控制器
【发布时间】:2020-05-21 02:33:20
【问题描述】:

我有两个视图控制器。

VC1 - 在 tableView 中显示数据,选择其中一个单元格转到 VC2。 VC2 - 显示文本字段以编辑数据。

问题 - 更新数据并返回 VC1 后,它不会在表中显示更新的数据。

我确实尝试在 ViewWIllAppear 中添加 tableView.reloadData(),但是当我关闭 VC2 时没有调用 ViewWillAppear 方法。

//代码如下 VC2 -

@IBAction func saveTask(_ sender: Any) {
    self.dismiss(animated: true, completion: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    view.endEditing(true)
    if let task = task {
        task.completed = toggleStatus.isOn
    }
}

VC1-

    override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    tableView.reloadData()
}

【问题讨论】:

    标签: ios swift uitableview viewwillappear


    【解决方案1】:

    您必须更新从表视图中选择的数据集合中的项目

    例子:

    // The collection of your data is used to show in table view
    var data: [String] = []
    
    // After navigated back to the VC1, you have to update like:
    data[you_selected_index] = inputData // From VC2
    tableview.reloadData()
    
    

    更新

    class VC1: UIViewController {
        private var selectedIndex: Int?
    
    }
    extension VC1: UITableViewDelegate {
    
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            selectedIndex = indexPath.row
            let vc = VC2()
            vc.delegate = self
            present(vc, animated: true, completion: nil)
        }
    }
    // MARK: - InputInfoVCDelegate
    extension VC1: VC2Delegate {
    
        func onInputInfoSuccessUpdated(source: String?) {
            // Updating data here
            guard let index = selectedIndex else { return }
            data[index] = source
            tableView.reloadData()
        }
    }
    
    protocol VC2Delegate: class {
        func onInputInfoSuccessUpdated(source: String?)
    }
    class VC2: UIViewController {
    
        weak var delegate: VC2Delegate?
    
        @IBAction private func actionTapToBackButton(_ sender: Any) {
            delegate?.onInputInfoSuccessUpdated(source: inputTextField.text)
        }
    }
    

    【讨论】:

    • 谢谢!这意味着我需要从 VC2 中的 VC1 访问 tableView 并从那里重新加载它?
    • 您必须从 VC2 中获取数据(输入文本已编辑)并在 VC 1 中的数据集合中更新它
    • 我更新了关于代码的更多细节以便于理解,请检查
    • 它对你有用吗?如果您无法应用它们,请更新上面的代码,让我为您检查并修复它
    • 效果很好!我是协议和代表的新手-感谢您的帮助。这种模式解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2018-08-06
    • 2012-01-09
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多