关闭并显示按钮上的视图单击从另一个视图

Posted

技术标签:

【中文标题】关闭并显示按钮上的视图单击从另一个视图【英文标题】:Dismiss and Present A View On Button Click From Another View 【发布时间】:2017-03-13 17:01:54 【问题描述】:

我有一个容器视图,里面有一个表格视图。当我在表格视图上选择一个单元格时,它会显示一个视图控制器(1)。此视图控制器中有一个按钮,用于显示另一个视图控制器 (2)。当我离开 2 时,我需要 1 来重新加载它的数据。我假设要做到这一点,我需要在离开 2 后解除并再次呈现 1。我该如何做到这一点?

用于呈现 VC2 的 VC1 代码:

    @IBAction func contributeButtonTapped(_ sender: Any) 
    if totalContributions >= NeedStore.shared.currentNeed!.amount 
        let alert = UIAlertController(title: "", message: "This need has already been fully contributed to.", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default)
        alert.addAction(okAction)
        self.present(alert, animated: true, completion: nil)
     else 
        let storyboard = UIStoryboard(name: "Contribute", bundle: Bundle.main)
        let viewController = storyboard.instantiateViewController(withIdentifier: "ContributeViewController") as! ContributeViewController
        viewController.view.backgroundColor = .clear
        viewController.modalPresentationStyle = .overCurrentContext
        self.present(viewController, animated: false, completion: nil)
    

用于切换回 VC1 的 VC2 代码:

    func detailView() 
    ApiManager.shared.getNeed(needId: NeedStore.shared.currentNeed!.id)  (need) in
        NeedStore.shared.currentNeed = need
        ApiManager.shared.getNeedUser  (object) in
            if object 
                self.dismiss(animated: false, completion: nil)
                let storyboard = UIStoryboard(name: "NeedDetail", bundle: Bundle.main)
                let viewController = storyboard.instantiateViewController(withIdentifier: "NeedDetailViewController") as! NeedDetailViewController
                viewController.view.backgroundColor = .clear
                viewController.modalPresentationStyle = .overCurrentContext
                self.present(viewController, animated: false, completion: nil)
            
        
    

【问题讨论】:

你也可以在视图控制器(1)的viewDidAppear中处理这个 【参考方案1】:

在您的 VC(1) 的 viewDidAppear() 中添加 self.tableview.reloadData()

如果这不起作用,您可能需要创建一个委托,以便它知道您正在离开 VC(2),进入(1),然后刷新它。

更新 -

添加委托方法

protocol: ViewController2Delegate: class 
 func reloadTableView()


class ViewController2: UIViewController 


weak var delegate: ViewController2Delegate?

@IBOutlet func goBackButton () 
 delegate.reloadTableView()
 

VC1-

class ViewController1: UIViewController, ViewController2Delegate 
 func reloadTableView() 
   self.tableView.reloadData()
   *- Whatever code you might be using to call your data too-*
 


【讨论】:

我想我说错了,那是我的错。表格视图在技术上将是第一个视图控制器。在其上选择一个单元格会出现我称之为 VC(1) 的内容。关闭该按钮会显示另一个视图,当我离开最终视图时,我需要单击单元格以刷新其数据后出现的视图。我们已经尝试重新加载 tableView 数据,但还没有成功。 那么,TableView -> TableViewCell -> VC1(刷新这个?) -> VC2? 表格视图 -> 单击表格视图单元格 -> VC1 出现 -> 单击按钮 VC1 -> VC2 出现 -> 当 VC2 关闭时,VC1 需要刷新它的数据。我一直运行它的 viewDidLoad 并且数据仍然没有刷新。 尝试一些简单的事情,添加 VC1 打印的 viewDidLoad() (“测试此方法是否有效”)如果打印,这意味着 viewDidLoad() 在 VC2 被关闭时被调用。让我知道:) 我实际上已经这样做了,这就是我在离开 VC2 时知道 viewDidLoad() 再次运行的方式。所以,这就是为什么我对为什么没有更新感到困惑。所有信息都是从对数据库的 Alamofire 调用中检索到的,当我加载 VC1 和离开 VC2 并且仍然没有更新时,我进行了该调用。我们拨打电话并将信息存储在本地。

以上是关于关闭并显示按钮上的视图单击从另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

从另一个具有按钮的视图控制器显示隐藏在视图控制器上的图像

ember.js 从另一个视图更改视图

如何在单击另一个视图(即按钮)时突出显示自定义列表视图

关闭一个视图控制器并显示另一个视图控制器

从另一个视图控制器中取消选择按钮

单击按钮时剑道网格不会打开剑道窗口