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