上一个视图控制器中的更新按钮

Posted

技术标签:

【中文标题】上一个视图控制器中的更新按钮【英文标题】:Update button in previous view controller 【发布时间】:2018-10-24 12:12:46 【问题描述】:

我正在使用 NavigationController 来显示某个用户的关注者列表。在这个列表(一个 UITableView)中,有头像、用户名,最右边是关注或取消关注按钮。

我已经设法实现了一个检查用户是否已经关注的功能,因此它清楚地显示了关注或取消关注。我还可以在用户开始关注其他用户后更新按钮,取消关注也是如此。

但是,可以单击用户名或个人资料图片,然后我将 NavigationController 推送到被单击用户的个人资料。

navViewController?.pushViewController(userVC, animated: true)

个人资料页面上是相同的关注或取消关注按钮,具有相同的逻辑(但略有调整,因为我不需要个人资料页面上的 indexPaths 等)。一切正常,除非我从列表中转到某人的个人资料页面,开始关注或取消关注并使用 NavigationController 上的后退按钮返回列表。它仍然显示之前的文本并应用错误的逻辑(如果我取消关注个人资料,返回并取消关注列表(这应该不可能,但按钮尚未更新)我创建了双重取消关注,排序说话。

我正在寻找一种方法来更新前一个视图(UITableView)上的按钮。有任何想法吗?我不能使用 .observe 代替 .observeSingleEvent,因为这将创建一个关注和取消关注的循环,因为我获取列表的代码如下:

func getUsers() 

    var Ref: DatabaseReference!
    Ref = Database.database().reference()

    Ref.child("users").queryOrdered(byChild: "userLastName").observeSingleEvent(of: .value)  (snapshotUsers) in

        for child in snapshotUsers.children 

            let snap = child as! DataSnapshot
            let dict = snap.value as! [String: Any]

            if(snap.key != Auth.auth().currentUser?.uid) 
                Ref.child("users").child(snap.key).child("userFollowers").child((Auth.auth().currentUser?.uid)!).observeSingleEvent(of: .value)  (checkFollow) in

                    if checkFollow.exists() 

                        self.myArray.append(usersToFollow(userID: snap.key, userName: (dict["userFirstName"] as! String) + " " + (dict["userLastName"] as! String), userFirstName: (dict["userFirstName"] as! String), userLastName: (dict["userLastName"] as! String), userProfilePicURL: (dict["userProfilePicURL"] as! String), isFollowing: true))

                     else 

                        self.myArray.append(usersToFollow(userID: snap.key, userName: (dict["userFirstName"] as! String) + " " + (dict["userLastName"] as! String), userFirstName: (dict["userFirstName"] as! String), userLastName: (dict["userLastName"] as! String), userProfilePicURL: (dict["userProfilePicURL"] as! String), isFollowing: false))

                    

                    self.myTableView.reloadData()

                

            

        

    


任何有关如何在我的 UITableView 中解决此问题的帮助将不胜感激!

【问题讨论】:

你可以在List ViewControllerviewDidAppear()中调用这个getUsers()方法 没错。在问这个问题之前我已经实现了这个,并且它有效,但是通过单独重新加载我无法达到我想要的结果 - 我必须从我的数组中删除All()并在 viewWillAppear 中再次调用 getUsers()。问题是它会短暂闪烁并转到 tableview 的顶部(因为所有记录都被删除并再次加载),如果您要浏览 250 个用户的列表并且必须从顶部开始,这将不是很好每次再一次。这就是为什么我想知道是否有更好的解决方案.. 看,我认为您可以避免重新加载所有行是,当 userList ViewController 导航到另一个配置文件时,您可以暂时将该行的IndexPath记录在一个变量中,如果用户通过点击button改变了关注/取消关注的状态,您可以创建一个单独的protocol和使您的 List ViewController 符合该要求,并在 protocol 中提供一个 method,该方法根据IndexPath(我们之前记录的)更新单行)。现在这个方法会在用户点击Follow/Unfollow按钮时被调用 为此你需要学习如何使用协议在 ViewController 之间传递数据 我可以通过添加一个可选变量来实现它,我在其中设置单元格的行,然后在关注或取消关注和更新发送的行中的按钮时检查它是否在配置文件中设置?或者这是不可能的? 【参考方案1】:

你可以简单地使用 NSNotification 来调用你的 tableView.reloadData(): 将此添加到您的 tableView 控制器 (TVC) ViewDidLoad:

NotificationCenter.default.addObserver(self, selector: #selector(reload), name: NSNotification.Name(rawValue: "load"), object: nil)

这个功能到你的TVC

@objc func reload()

      //setup ur new data
      self.tableView.reloadData()


然后只需在用户的 pf VC 中添加到您的后退按钮 IBAction

  NotificationCenter.default.post(name: NSNotification.Name(rawValue: "load"), object: nil)

【讨论】:

问题是,我不想重新加载数据,因为我想保持与以前相同的列表,但编辑按钮及其设置的操作。我现在已经实现了一种方法来检查是否有以前的控制器,如果有,单元格中的按钮会更新。仍在测试中,但目前似乎可以正常工作。 这样您就可以在导航之前将所选用户的索引保留在您的用户列表中,然后在 pf VC 中,通过通知发送状态(关注/不关注),并在 @objc func reload( ) 而不是重新加载整个表视图只需更新按钮(因为你现在同时拥有索引和状态)

以上是关于上一个视图控制器中的更新按钮的主要内容,如果未能解决你的问题,请参考以下文章

在主视图控制器中单击后更新外部视图控制器中的 UITextField

导航返回时导航控制器和视图未更新

关闭模态视图控制器时更新前一个视图控制器中的pickerView

从另一个类 Swift 更新视图控制器的 UI [关闭]

通过单击 Swift 3 中的 Alert Ok 按钮,翻转回同一视图控制器上的另一个视图

Swift如何更新先前视图控制器中的标签