swift – 发布到Firebase时,Cell重复多次
发布时间:2020-12-14 04:56:07 所属栏目:百科 来源:网络整理
导读:我正在制作一个可以发布消息的应用程序.我将数据存储在Firebase中.当我发布新消息时,该特定单元格多次复制(所以我看到帖子有2,3,4次或更多次).但它只是Firebase中的一个帖子.当我刷新屏幕时(例如对数据进行排序),它只是一个帖子.我究竟做错了什么? 这是我的
我正在制作一个可以发布消息的应用程序.我将数据存储在Firebase中.当我发布新消息时,该特定单元格多次复制(所以我看到帖子有2,3,4次或更多次).但它只是Firebase中的一个帖子.当我刷新屏幕时(例如对数据进行排序),它只是一个帖子.我究竟做错了什么?
这是我的相关代码: override func viewDidLoad() { super.viewDidLoad() DataService.ds.REF_POSTS.observeEventType(.Value,withBlock: { snapshot in let sortByDate = NSUserDefaults.standardUserDefaults().boolForKey("sortByDate") if sortByDate == true { self.sortingByDate() self.tableView.reloadData() } else { self.sortingByLikes() self.tableView.reloadData() } }) } 按日期排序数据: func sortingByDate() { NSUserDefaults.standardUserDefaults().setBool(true,forKey: "sortByDate") sortDateBtn.setTitleColor(UIColor(red: 255/255,green: 102/255,blue: 102/355,alpha: 1.0),forState: .Normal) sortLikeBtn.setTitleColor(UIColor(red: 76/255,green: 76/255,blue: 76/355,forState: .Normal) if (searchController.active) { self.posts = [] DataService.ds.REF_POSTS.queryOrderedByChild("timestamp").observeEventType(.ChildAdded,withBlock: { snapshot in if let postDict = snapshot.value as? Dictionary<String,AnyObject> { let key = snapshot.key let post = Post(postKey: key,dictionary: postDict) self.posts.insert(post,atIndex: 0) } if let searchText = self.searchController.searchBar.text { self.filterContent(searchText) self.tableView.reloadData() } }) } else { self.posts = [] DataService.ds.REF_POSTS.queryOrderedByChild("timestamp").observeEventType(.ChildAdded,atIndex: 0) } self.tableView.reloadData() }) } } 按喜欢排序数据: func sortingByLikes() { NSUserDefaults.standardUserDefaults().setBool(false,forKey: "sortByDate") sortLikeBtn.setTitleColor(UIColor(red: 255/255,forState: .Normal) sortDateBtn.setTitleColor(UIColor(red: 76/255,forState: .Normal) if (searchController.active) { self.posts = [] DataService.ds.REF_POSTS.queryOrderedByChild("likes").observeEventType(.ChildAdded,atIndex: 0) } if let searchText = self.searchController.searchBar.text { self.filterContent(searchText) self.tableView.reloadData() } }) } else { self.posts = [] DataService.ds.REF_POSTS.queryOrderedByChild("likes").observeEventType(.ChildAdded,atIndex: 0) } self.tableView.reloadData() }) } } 发布到Firebase: func postToFirebase(imgUrl: String?) { let imageForProfile = NSUserDefaults.standardUserDefaults().valueForKey("profileImage") var post: Dictionary<String,AnyObject> = [ "title": titleTextField.text!,"description": descriptionTextField.text!,"likes": 0,"location": locationTextField.text!,"username": usernameDisplay.text!,"uid": NSUserDefaults.standardUserDefaults().valueForKey(KEY_UID)!,"img": String(imageForProfile!),"timestamp": NSDate.timeIntervalSinceReferenceDate(),"lat": lat,"long": long,] if imgUrl != nil { post["imageUrl"] = imgUrl } let firebasePost = DataService.ds.REF_POSTS.childByAutoId() let url = NSURL(fileURLWithPath: "(firebasePost)") let lastComponent = url.lastPathComponent if lastComponent != nil { post["postKey"] = lastComponent! } firebasePost.setValue(post) titleTextField.text = "" descriptionTextField.text = "" locationTextField.text = "" imageField.image = UIImage(named: "camera") imageSelected = false NSUserDefaults.standardUserDefaults().setBool(true,forKey: "sortByDate") } 泰伯维: func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell { let postList = searchController.active ? searchResult[indexPath.row] : posts[indexPath.row] let post = postList cell.request?.cancel() var image: UIImage? if let url = post.postImgUrl { image = FeedVC.imageCache.objectForKey(url) as? UIImage } var image2: UIImage? if let url2 = post.userImgUrl { image2 = FeedVC.imageCache.objectForKey(url2) as? UIImage } cell.configureCell(post,img: image,img2: image2) return cell } else { return PostCell() } } 我的cell.configurecell实现: func configureCell(post: Post,img: UIImage?,img2: UIImage?) { self.post = post likeRef = DataService.ds.REF_USER_CURRENT.childByAppendingPath("likes").childByAppendingPath(post.postKey) self.descriptionText.text = post.postDescription self.descriptionText.scrollRangeToVisible(NSMakeRange(0,0)) self.likes = post.likes self.likesLbl.text = "(post.likes) likes" self.postTitle.text = post.postTitle self.postLocation.text = post.postLocation self.username.text = post.username self.postKeyLbl.text = post.key self.lat = post.lat self.long = post.long if post.postImgUrl != nil { if img != nil { self.showcaseImg.image = img } else { request = Alamofire.request(.GET,post.postImgUrl!).validate(contentType: ["image/*"]).response(completionHandler: { request,response,data,err in if err == nil { let _img = UIImage(data: data!)! self.showcaseImg.image = img FeedVC.imageCache.setObject(_img,forKey: self.post.postImgUrl!) } else { print(err.debugDescription) } }) } } else { self.showcaseImg.hidden = true } if post.userImgUrl != nil { if img2 != nil { self.profileImg.image = img2 } else { request = Alamofire.request(.GET,post.userImgUrl!).validate(contentType: ["image/*"]).response(completionHandler: { request,err in if err == nil { let _img2 = UIImage(data: data!)! self.profileImg.image = img2 FeedVC.imageCache.setObject(_img2,forKey: self.post.userImgUrl!) } else { print(err.debugDescription) } }) } } else { print("no image") } likeRef.observeSingleEventOfType(.Value,withBlock: { snapshot in if snapshot.value is NSNull { self.likesImg.image = UIImage(named: "heart") } else { self.likesImg.image = UIImage(named: "heart-filled") } }) let getUid = NSUserDefaults.standardUserDefaults().valueForKey(KEY_UID) if String(getUid!) == (self.post.postUid) { editBtn.hidden = false delBtn.hidden = false let usernameDefaults = NSUserDefaults.standardUserDefaults().valueForKey("username") if usernameDefaults != nil { username.text = String(usernameDefaults!) } let checkIfImageChanged = NSUserDefaults.standardUserDefaults().boolForKey("imgIsChanged") if checkIfImageChanged == true { self.changePost() NSUserDefaults.standardUserDefaults().setBool(false,forKey: "imgIsChanged") } } else { editBtn.hidden = true delBtn.hidden = true } mapVC.markerTitle = postTitle.text mapVC.markerSnippet = postLocation.text mapVC.markerLat = lat mapVC.markerLong = long } 谢谢你的帮助! 解决方法
由于您使用委托方法tableView.dequeueReusableCellWithIdentifier,因此在请求新单元格时,如果不使用新数据更新新单元格,则会带来包含旧数据的单元格.为了确保我需要查看你的cell.configureCell实现.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |