在我的swift
ios应用中,我有一个UITableView
- 在故事板中,我添加了3个单元格。前两个是静态的,第三个是动态的,基本上前两个显示一些信息,第三个(其余基于第三个)显示注释。我从我的网络服务器上获取json的评论。
当json为空时,我看到单元格没有。 1而不是。 2 - 没关系。但是当json有一个值时,我只看到单元格没有。 1,我没有看到2或3.当json有2条评论时 - 我看到两个静态单元格。 当json有3条评论时,我看到两个静态单元格+第三条评论。基本上我从来没有看到两个第一个评论。
问题可能在这里 - 这就是我从webservice获取评论的方式:
@IBOutlet weak var myTableView: UITableView!
var items = NSMutableArray()
....
Alamofire.request(.GET, "\(serverURL)/comments/\(case_id)/comments/")
.validate()
.responseJSON { response in
switch response.result {
case .Success:
self.items.removeAllObjects()
if let jsonData = response.result.value {
let data = JSON(jsonData)
if let responseDictionary = data.dictionary {
if let commentsArray = responseDictionary["comments"]?.array {
for commentObject in commentsArray {
if let singleComment = SingleComment.fromJSON(commentObject){
self.items.addObject(singleComment)
}
}
self.myTableView.reloadData()
}
}
}
self.myTableView.reloadData()
case .Failure(let error):
print("SWITCH ERROR comments")
print(error)
}
}
我的方法numberOfRowsInSection
如下所示:
func tableView(tview: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.items.count == 0{
return 2
} else {
return self.items.count;
}
}
我认为解决办法可能只是修改上面else块中的return语句,使其为return self.items.count+2
,但会引发错误:
*由于未捕获的异常'NSRangeException'终止应用程序,原因:'* - [__ NSArrayM objectAtIndex:]:索引2超出边界[0 .. 0]'
在这种情况下我该怎么办?
======编辑
我的cellForRowAtIndexPath
是一种较长的方法,但我将其修剪为最重要的内容:
func tableView(myComments: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.row == 0 {
let cell = myComments.dequeueReusableCellWithIdentifier("firstCell") as! FirstCell
...
return cell
}
else if indexPath.row == 1 {
let cell = myComments.dequeueReusableCellWithIdentifier("cellStatic") as! SecondCell
...
return cell
} else {
let cell = myComments.dequeueReusableCellWithIdentifier("cell") as! SingleCommentCell
let comment:SingleComment = self.items[indexPath.row] as! SingleComment
...
return cell
}
}
答案 0 :(得分:1)
您需要在numberOfRowsInSection
和cellForRowAtIndexPath
函数中允许2个静态行。行数是2加上项目的数量
func tableView(tview: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.items.count + 2;
}
检索要显示的项目时,行值将比所需的items
数组索引多两个,因此第2行将需要item[0]
:
func tableView(myComments: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.row == 0 {
let cell = myComments.dequeueReusableCellWithIdentifier("firstCell") as! FirstCell
...
return cell
}
else if indexPath.row == 1 {
let cell = myComments.dequeueReusableCellWithIdentifier("cellStatic") as! SecondCell
...
return cell
} else {
let cell = myComments.dequeueReusableCellWithIdentifier("cell") as! SingleCommentCell
let comment = self.items[indexPath.row - 2] as! SingleComment
...
return cell
}
}
另外,我建议您修改获取代码和数组定义,以使这些项目为var items = [SingleComment]()
而不是NSMutableArray
。这将消除向下转换从数组中检索的对象的需要。