UITableView滚动时自定义单元格信息会发生变化

时间:2016-02-16 19:09:26

标签: swift2 ios9 xcode7 custom-cell

我是使用Swift 2和Xcode 7进行编码的新手,我知道有些人问过类似的问题,但我无法弄清楚我的问题。 首先,我有一个自定义单元格,其中包含一个开关和3个标签。 从2D阵列读取这些单元的内容。 该数组包含一个1或0表示开关位置,一个数字表示一个月中的某一天,另一个表示货币值和描述。 标签文本根据当前日期或开关打开或关闭而改变颜色。 当切换单元格中的开关时,2D阵列会改变以指示更改。

Image of Cell created from 2D array

我遇到的问题与其他人看到的一样,那就是当您向上或向下滚动SWITCH设置或标签颜色发生变化时。 数组的内容不会改变,可以通过移动到另一个屏幕然后再返回来刷新表。

我知道这与重复使用单元格有关,但我想不出如何将其添加到我的代码中。

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return billList.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell",forIndexPath: indexPath) as! billTableViewCell
    let cellAmountStyle = NSNumberFormatter()
    cellAmountStyle.numberStyle = .CurrencyStyle
    cell.cellBillDate.text = String(Int(String(billList[indexPath.row][12]))!)
    cell.cellBillAmount.text = cellAmountStyle.stringFromNumber(Float(String(billList[indexPath.row][month - 1]))!)        
    cell.cellBillDescription.text = String(billList[indexPath.row][13])
    cell.cellBillPayedOnOff.tag = indexPath.row
    cell.delegate = self 
    if String(billList[indexPath.row][month - 1]) != "0.00" {
        if billList[indexPath.row][14] == "0" {
            cell.cellBillPayedOnOff.on = false
            // Colour Text, RED if past date and Black if OK
            if (monthdate >= Int(billList[indexPath.row][12])) {
                cell.cellBillDescription.textColor = UIColor.redColor()
            }
            else {
                cell.cellBillDescription.textColor = UIColor.blackColor()
            }
        }else{
            cell.cellBillPayedOnOff.on = true
            cell.cellBillDescription.textColor = UIColor.lightGrayColor()
        }
    }else {
        cell.cellBillDescription.textColor = UIColor.lightGrayColor()
        cell.cellBillAmount.textColor = UIColor.lightGrayColor()
        cell.cellBillDate.textColor = UIColor.lightGrayColor()            
    }
    // Update other screen information
    updateAmounts()
    return cell        
}

请有人帮我解决这个问题,我相信它会帮助其他有类似问题的人。

1 个答案:

答案 0 :(得分:1)

是的,由于可重复使用的细胞,你已经清楚地发现了这个原因。所以答案是你应该为细胞中的每个元素赋予颜色。问题是你只为某些部分设置颜色。如果您更正了以下代码,则可以实现您的目标。

  

注意

     

请为每个条件状态提供适当的颜色。请给   你应该纠正什么。

org.apache.jasper.JasperException: org.apache.tiles.template.NoSuchAttributeException: Attribute 'header' not found.
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1244)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

root cause

org.apache.tiles.template.NoSuchAttributeException: Attribute 'header' not found.
    org.apache.tiles.template.DefaultAttributeResolver.computeAttribute(DefaultAttributeResolver.java:50)
    org.apache.tiles.template.InsertAttributeModel.resolveAttribute(InsertAttributeModel.java:165)
    org.apache.tiles.template.InsertAttributeModel.execute(InsertAttributeModel.java:121)
    org.apache.tiles.jsp.taglib.InsertAttributeTag.doTag(InsertAttributeTag.java:299)
    org.apache.jsp.view.home_jsp._jspx_meth_tiles_005finsertAttribute_005f0(home_jsp.java:379)
    org.apache.jsp.view.home_jsp._jspx_meth_c_005fif_005f0(home_jsp.java:318)
    org.apache.jsp.view.home_jsp._jspService(home_jsp.java:147)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1244)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)