【问题标题】:How to reloadData() in ViewController #1 after ViewController #2 is dismissed?ViewController #2 关闭后如何在 ViewController #1 中重新加载数据()?
【发布时间】:2021-02-27 03:13:03
【问题描述】:

我是 iOS 新手,这是我的问题:

我有一个带有一些文本字段和保存按钮的 saveCardViewController(以模态方式呈现)。

@IBAction func Save(_ sender: UIButton) {
    
    date = datePicker.date
    
    try! realm.write() {
        
        sessionCard.pokerType = pokerTypeSegment.titleForSegment(at: pokerTypeSegment.selectedSegmentIndex)!
        date = dateFormatter.string(from: date)
        sessionCard.handsPlayed = Int(handPlayedTextlabel.text!) ?? 0
        sessionCard.moneyIn = Int(moneyInTextLabel.text!) ?? 0
        sessionCard.moneyOut = Int(moneyOutTextLabel.text!) ?? 0
        sessionCard.timePlayed = Int(timePlayedTextLabel.text!) ?? 0
        sessionCard.sortDate = date
        
        realm.add(sessionCard)
        
    }
    dismiss(animated: true, completion: nil)
}

在按下 Save 按钮并关闭 saveCardViewController 后,我如何在主 ViewController 上重新加载数据()。

谢谢!

编辑#1:

感谢@davidev 的回答,我做了更改,但仍然没有更新

我的 ViewController 与 TableView:

class SessionViewController: BackgroundViewController, RefreshViewDelegate {


func refreshView() {
    tableView.reloadData()
}
    
override func viewDidLoad() {
    super.viewDidLoad()
    
    tableView.delegate = self
    tableView.dataSource = self       

}

我的 ViewController 带有数据和保存按钮:


    protocol RefreshViewDelegate {
    func refreshView()
}

class AddSessionViewController: UIViewController, UITextFieldDelegate {
    
    var delegate: RefreshViewDelegate?
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
               
        
    }

 @IBAction func TEST2(_ sender: UIButton) {
        
        delegate?.refreshView()
        dismiss(animated: true, completion: nil)
        
    }

【问题讨论】:

  • NotificationCenter/委托模式或回调
  • 我赞成@davidev 的回答,因为他专注于使用委托。通知的唯一问题 - 它们会起作用 - 是委托是 1:1(意味着您的 saveCardViewController 与呈现它的 VC 紧密相关)通知不是(它们将其发送给订阅它的第一个接收者)。至于使用回调?我不确定,但听起来不像你想要的。
  • 我编辑我的问题,你们可以看看@davidev
  • 看起来不错。但是显示使用您以模态方式打开子视图的代码。在那里,您创建子视图,您必须设置委托。让 vc = AddSessionViewController() 然后 vc.delegate = self
  • @davidev 我认为我做错了什么,因为我连接了这样的视图prnt.sc/vjp9al

标签: ios swift uiviewcontroller tableview dismiss


【解决方案1】:

您可以使用delegate 模式来实现这一点。

像这样声明你的刷新协议:

protocol RefreshViewDelegate {
    func refreshView()
}

使您的父视图符合此协议并使用您的自定义刷新操作实现 refreshView()。还要确保将子视图的委托设置为自己。

saveCardViewController 中声明你的委托变量

var delegate : RefreshViewDelegate?

并在您的 IBaction 中调用委托操作

delegate?.refreshView()

编辑:

我刚刚看到您更新的代码。当您使用 Storyboard segues 时,您仍然必须通过代码设置委托。在您的主视图控制器中添加功能:

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
    if let viewController = segue.destinationViewController as? AddSessionViewController
    {
        viewController.delegate = self
    }
}

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 2020-03-25
    • 2021-05-28
    • 2014-05-09
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    相关资源
    最近更新 更多