我有一个tableView,我想显示我的评论,例如Instagram和许多其他社交网络如何做。帖子下面有3条评论,这是一张图片来解释:
从图片中可以看出,在顶部有帖子,然后是标题,最后是3条最新评论。
我已经在我的应用程序中添加了一个评论系统,当我点击评论图标时,我可以查看所有评论,然后我被重定向到新的VC。
当我添加标题时,我也为每个帖子都有一个UUID,所以我认为这可以在某种程度上帮助将评论连接到帖子!
但现在我正在寻求实现这一目标。
到目前为止,我在帖子下方的故事板中添加了3个UIlabels,然后我为这些标签创建了一个收集插座。现在在我的表视图中,我有一个查询来获取最新的3条评论:
var commentUsername = [String]()
var commentArray = [String]()
let Commentquery = PFQuery(className: "Comments")
Commentquery.whereKey("toPost", containedIn: self.uuidArray)
Commentquery.addDescendingOrder("createdAt")
Commentquery.limit = 3
Commentquery.findObjectsInBackgroundWithBlock({ (objects:[PFObject]?, error:NSError?) -> Void in
if error == nil {
self.commentUsername.removeAll(keepCapacity: false)
self.commentArray.removeAll(keepCapacity: false)
for object in objects! {
self.commentArray.append(object.objectForKey("comment") as! String)
self.commentUsername.append(object.objectForKey("username") as! String)
}
tableView.reloadData
}
})
接下来是我在CellForRowAtIndexPath中显示它们的方式:
var counter = (indexPath.row * 3)
let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! NewsFeedTableViewCell
for comments in cell.threeComments{
comments.text = commentArray[counter++]
comments.sizeToFit()
}
就在那条线上“comments.text = commentArray [counter ++]”我得到数组索引超出范围。
我猜我收到了这个错误,因为它要么返回nil,因为没有对该照片的评论,或者没有至少3条评论来填充UILabels ......这就是我有一段时间遇到的困难现在,如果有人知道如何修复或正确可能的“可选”查询或一些非常好的事情!!
如有任何进一步说明,请在下面发表评论。
最好的问候&提前谢谢!
完整代码:
var usernameArray = [String]()
var profilePicture = [PFFile]()
var dateArray = [NSDate?]()
var postArray = [PFFile]()
var titleArray = [String]()
var uuidArray = [String]()
var followArray = [String]()
var commentUsername = [String]()
var commentArray = [String]()
override func viewDidLoad() {
super.viewDidLoad()
loadPosts()
}
func loadPosts() {
let followQuery = PFQuery(className: "Follows")
followQuery.whereKey("follower", equalTo: PFUser.currentUser()!.username!)
followQuery.findObjectsInBackgroundWithBlock ({ (objects:[PFObject]?, error:NSError?) -> Void in
if error == nil {
self.followArray.removeAll(keepCapacity: false)
for object in objects! {
self.followArray.append(object.valueForKey("following") as! String)
}
self.followArray.append(PFUser.currentUser()!.username!)
let query = PFQuery(className: "Posts")
query.whereKey("username", containedIn: self.followArray)
query.limit = self.page
query.addDescendingOrder("createdAt")
query.findObjectsInBackgroundWithBlock({ (objects:[PFObject]?, error:NSError?) -> Void in
if error == nil {
self.usernameArray.removeAll(keepCapacity: false)
self.profilePicture.removeAll(keepCapacity: false)
self.dateArray.removeAll(keepCapacity: false)
self.postArray.removeAll(keepCapacity: false)
self.titleArray.removeAll(keepCapacity: false)
self.uuidArray.removeAll(keepCapacity: false)
for object in objects! {
self.usernameArray.append(object.valueForKey("username") as! String)
self.profilePicture.append(object.valueForKey("profilePicture") as! PFFile)
self.dateArray.append(object.createdAt)
self.postArray.append(object.valueForKey("image") as! PFFile)
self.titleArray.append(object.valueForKey("caption") as! String)
self.uuidArray.append(object.valueForKey("uuid") as! String)
}
let Commentquery = PFQuery(className: "Comments")
Commentquery.whereKey("toPost", containedIn: self.uuidArray)
Commentquery.addDescendingOrder("createdAt")
Commentquery.limit = 3
Commentquery.findObjectsInBackgroundWithBlock({ (objects:[PFObject]?, error:NSError?) -> Void in
if error == nil {
self.commentUsername.removeAll(keepCapacity: false)
self.commentArray.removeAll(keepCapacity: false)
for object in objects! {
self.commentArray.append(object.objectForKey("comment") as! String)
self.commentUsername.append(object.objectForKey("username") as! String)
}
self.tableView.reloadData()
}else {
print(error?.localizedDescription)
}
})
} else {
print(error!.localizedDescription)
}
})
} else {
print(error!.localizedDescription)
}
})
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return uuidArray.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
var counter = (indexPath.row * 3)
let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! NewsFeedTableViewCell
for comments in cell.threeComments{
comments.text = commentArray[counter++]
comments.sizeToFit()
}
}
}
答案 0 :(得分:2)
indexPath.row给出了当前单元格索引号,无需使用循环进行迭代,如果需要3个单元格,则必须在
中设置它func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return commentArray.count // you can set static number 3 here, instead of set 'commentArray.count'
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell") as! NewsFeedTableViewCell
comments.text = commentArray[indexPath.row]
comments.sizeToFit()
}
你可以像这样改变你的循环
for (index, comments) in cell.threeComments {
comments.text = commentArray[index]
comments.sizeToFit()
}
答案 1 :(得分:0)
这种设计需要改进,(参见评论),但要避免崩溃,你可以简单地做:
for comments in cell.threeComments{
if commentsArray.count < counter {
comments.text = commentArray[counter]
comments.sizeToFit()
}
counter += 1
}
仅供参考,我删除了计数器++,因为在Swift 3.0中删除了一元运算符
答案 2 :(得分:0)
@Jack - 我认为解决方案与您的其他问题https://stackoverflow.com/questions/35854857/how-to-order-2-tableview-sections/35866457?noredirect=1#comment59402360_35866457非常相似,您应该考虑存储用户名&amp;在结构中注释文本,并将查询结果加载到该结构中。
如果所有内容都加载到名为comments
的数组中,那么您仍然可以选择 - 要么显示所有三行的单个标签(设置故事板中的行数= 3),要么有三个标签
// single label
myLabel.text = ""
for comment in comments
{
myLabel.text += comment.text + "\n"
}
// multiple labels approach, assuming labels have tag value 100, 101, 102
for index in 0..<comments.count
{
let label = cell.contentView.viewWithTag(100 + index) as! UILabel
label.text = comments[index]
}
**已更新 - cell.contentView.viewWithTag **
我使用的标签值从100开始而不是0,以避免与默认值的任何意外匹配
以下是设置tag
值的方法。在这个例子中,我有两个自定义单元格,黄色单元格有三个标签。如果您依次选择每个标签,并如图所示设置Tag
属性,那么创建的单元格的每个实例都将具有相同标签的三个标签 - 但您只能在单个单元格的上下文中进行搜索,所以对其他情况无关紧要。