UITableView不在视野范围内

时间:2015-06-01 17:50:13

标签: ios uitableview swift

我有一个带有复选标记的多选项的UITableView。当我做出在视图中都可见的选择时,我不会遇到任何错误。但是,如果我进一步向下滚动并将所选项目放在视图之外,我会收到错误,即使该行保持选中状态,复选标记也会消失。

import Foundation
import Parse
import UIKit

class customerMenuVC: UIViewController, UITableViewDelegate, UITableViewDataSource { 

@IBOutlet weak var menuTV: UITableView!

var menuItems: [String] = ["Hello"]
var menuPrices: [Double] = [0.0]
var orderSelection: [String] = []
var priceSelection: [Double] = []

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int

{
    return menuItems.count

}

func tableView(tableView: UITableView, numberOfColumnsInSection section: Int) -> Int
{

    return 1;
}


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

{
    let cell:UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "mycell")

    cell.textLabel!.text = "\(menuItems[indexPath.row])\t $\(menuPrices[indexPath.row])"

    return cell

}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
    //tableView.deselectRowAtIndexPath(indexPath, animated: true)
    let cell = tableView.cellForRowAtIndexPath(indexPath)
    cell!.accessoryType = .Checkmark
    orderSelection.append(cell!.textLabel!.text!)
}
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath)
{
    let cell = tableView.cellForRowAtIndexPath(indexPath)
    cell!.accessoryType = .None
}


override func viewDidLoad() {
    super.viewDidLoad()
    menuTV.allowsMultipleSelection = true
    let resMenu = resUser.sharedInstance
    var resName = resMenu.nameStr
    var resID = resMenu.idStr

            var menuQ = PFQuery(className: "menu")
            menuQ.getObjectInBackgroundWithId(resID){
                (menus: PFObject?, error: NSError?) -> Void in
                if error == nil && menus != nil {
                    let items: [String] = menus?.objectForKey("menuItems") as! Array
                    let prices: [Double] = menus?.objectForKey("menuPrices") as! Array
                    self.menuItems = items
                    self.menuPrices = prices
                    self.menuTV.reloadData()
        }

    }

}

@IBAction func continueButton(sender: AnyObject) {
    let selections = menuTV.indexPathsForSelectedRows() as! [NSIndexPath]
    var indexCount = selections.count
    println(indexCount)
    var x = 0
    while x < indexCount
    {
        println(x)
        let currentCell = menuTV.cellForRowAtIndexPath(selections[x]) as? UITableViewCell?;
        println(x)
        println(selections[x].row.description)
        orderSelection.append(currentCell!!.textLabel!.text!)
        println(orderSelection[x])
        x++
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

1 个答案:

答案 0 :(得分:0)

这是表格视图的工作方式。

当单元格在屏幕外滚动时,它会被抛入循环队列,然后再次用于显示数据中不同indexPath的数据。

每当用户对单元格的数据进行任何更改时,都应将其保存到数据模型中(通常是一组信息,如果您正在使用分段表视图,则可能是数组数组。)然后,您应该告诉表视图重新显示更改的单元格。 cellForRowAtIndexPath方法获取已更改的数据并显示对单元格的更改。如果单元格在屏幕外滚动然后在屏幕上向后滚动,则会以正确的设置显示它。

这适用于跟踪选择的单元格。