我在UITableView中混合了静态和动态UITableViewCells,并在numberOfRowsInSection中输入了错误的值

时间:2016-09-25 22:30:45

标签: ios uitableview

在我的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
    }

}

1 个答案:

答案 0 :(得分:1)

您需要在numberOfRowsInSectioncellForRowAtIndexPath函数中允许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。这将消除向下转换从数组中检索的对象的需要。