滚动时 UITableView 复选标记消失
UITableView Checkmarks disappear when scrolling
我必须在 tableView 上打勾,但如果我滚动时一个勾选标记的单元格不可见,我向后滚动勾选标记消失了。
虽然 运行 此代码
var boolArray = [Bool]()
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var cell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
if cell.accessoryType == UITableViewCellAccessoryType.Checkmark {
cell.accessoryType = UITableViewCellAccessoryType.None
boolArray[indexPath.row] = false
}
else
{
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
boolArray[indexPath.row] = true
}
println(boolArray)
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
boolArray.append(false)
var view = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CellTable")
return view
}
稍微滚动和勾选后,打印的数组有这么大...
[真,假,真,真,真,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假]
当您执行 boolArray.append(false)
时,您的错误在 cellForRowAtIndexPath
中。每次绘制单元格时都会调用 cellForrRowAtIndexPath:
,即使它之前已经绘制过。如果 indexPath.row
大于 boolArray
的长度,则可能的解决方法是仅附加 false,否则就是你的 'model',你只需检查它即可。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
正如您从代码中看到的那样,重复使用了单元格。您需要保留所选单元格的状态,并在 var view = UITableViewCell ...
之后分配附属视图状态
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
var cell : UITableViewCell = .........
if(boolArray[indexPath.row){
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
} else {
cell.accessoryType = UITableViewCellAccessoryType.None
}
}
试试这个代码。
NSMutableIndexSet
是用于跟踪选择状态的更好对象。
当您return indexPath
的单元格时,您还需要检查选择状态
var selectedCells = NSMutableIndexSet()
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
var accessory=UITableViewCellAccessoryType.none
if (selectedCells.containsIndex(indexPath.row) {
selectedCells.removeIndex(indexPath.row)
}
else {
selectedCells.addIndex(indexPath.row)
accessory=.checkmark
}
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
cell.accessoryType = accessory
}
}
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell
{
var cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier:"CellTable")
var accessory=UITableViewCellAccessoryType.none
if (selectedCells.containsIndex(indexPath.row) {
accessory = .checkmark
}
view.accessoryType=accessory
return view
}
创建一个元组数组来存储行值和节值:
var selectedCells:[(row: Int, section: Int)] = []
在您的 cellForRowAtIndexPath
中,检查您是否有 selectedCellValues
。如果是这样,为该单元格添加一个 accessoryType
并跳出循环,
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCellWithIdentifier("SettingsCell", forIndexPath: indexPath) as SettingsCustomCell
var rowNums:NSNumber = indexPath.row
var sectionNums:NSNumber = indexPath.section
var selectedRow:Int
var selectedSection:Int
if(selectedCells.count > 0){
for tuple in selectedCells{
selectedRow = tuple.row
selectedSection = tuple.section
if(selectedRow == rowNums && selectedSection == sectionNums){
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
break
}else{
cell.accessoryType = UITableViewCellAccessoryType.None
}
}
}else{
cell.accessoryType = UITableViewCellAccessoryType.None
}
var keyValue = listOfSectionTitles[indexPath.section]
var items: [NSString] = dictionaryOfCellTitles.objectForKey(keyValue) as [NSString]
cell.textLabel?.text = items[indexPath.row]
return cell
}
在 didSelecteRowAtIndexPath
中处理 selectedcellvalues
:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath)
if(cell?.accessoryType == UITableViewCellAccessoryType.None){
cell?.accessoryType = UITableViewCellAccessoryType.Checkmark
selectedCells.append(row:indexPath.row, section:indexPath.section)
}else{
var rowToDelete = indexPath.row
var sectionToDelete = indexPath.section
for var i=0; i < selectedCells.count; i++
{
if(rowToDelete == selectedCells[i].row && sectionToDelete == selectedCells[i].section){
selectedCells.removeAtIndex(i)
cell?.accessoryType = UITableViewCellAccessoryType.None
}
}
}
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
我必须在 tableView 上打勾,但如果我滚动时一个勾选标记的单元格不可见,我向后滚动勾选标记消失了。
虽然 运行 此代码
var boolArray = [Bool]()
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var cell:UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)!
if cell.accessoryType == UITableViewCellAccessoryType.Checkmark {
cell.accessoryType = UITableViewCellAccessoryType.None
boolArray[indexPath.row] = false
}
else
{
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
boolArray[indexPath.row] = true
}
println(boolArray)
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
boolArray.append(false)
var view = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "CellTable")
return view
}
稍微滚动和勾选后,打印的数组有这么大...
[真,假,真,真,真,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假]
当您执行 boolArray.append(false)
时,您的错误在 cellForRowAtIndexPath
中。每次绘制单元格时都会调用 cellForrRowAtIndexPath:
,即使它之前已经绘制过。如果 indexPath.row
大于 boolArray
的长度,则可能的解决方法是仅附加 false,否则就是你的 'model',你只需检查它即可。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
正如您从代码中看到的那样,重复使用了单元格。您需要保留所选单元格的状态,并在 var view = UITableViewCell ...
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
var cell : UITableViewCell = .........
if(boolArray[indexPath.row){
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
} else {
cell.accessoryType = UITableViewCellAccessoryType.None
}
}
试试这个代码。
NSMutableIndexSet
是用于跟踪选择状态的更好对象。
当您return indexPath
的单元格时,您还需要检查选择状态var selectedCells = NSMutableIndexSet()
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
var accessory=UITableViewCellAccessoryType.none
if (selectedCells.containsIndex(indexPath.row) {
selectedCells.removeIndex(indexPath.row)
}
else {
selectedCells.addIndex(indexPath.row)
accessory=.checkmark
}
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
cell.accessoryType = accessory
}
}
func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell
{
var cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier:"CellTable")
var accessory=UITableViewCellAccessoryType.none
if (selectedCells.containsIndex(indexPath.row) {
accessory = .checkmark
}
view.accessoryType=accessory
return view
}
创建一个元组数组来存储行值和节值:
var selectedCells:[(row: Int, section: Int)] = []
在您的 cellForRowAtIndexPath
中,检查您是否有 selectedCellValues
。如果是这样,为该单元格添加一个 accessoryType
并跳出循环,
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCellWithIdentifier("SettingsCell", forIndexPath: indexPath) as SettingsCustomCell
var rowNums:NSNumber = indexPath.row
var sectionNums:NSNumber = indexPath.section
var selectedRow:Int
var selectedSection:Int
if(selectedCells.count > 0){
for tuple in selectedCells{
selectedRow = tuple.row
selectedSection = tuple.section
if(selectedRow == rowNums && selectedSection == sectionNums){
cell.accessoryType = UITableViewCellAccessoryType.Checkmark
break
}else{
cell.accessoryType = UITableViewCellAccessoryType.None
}
}
}else{
cell.accessoryType = UITableViewCellAccessoryType.None
}
var keyValue = listOfSectionTitles[indexPath.section]
var items: [NSString] = dictionaryOfCellTitles.objectForKey(keyValue) as [NSString]
cell.textLabel?.text = items[indexPath.row]
return cell
}
在 didSelecteRowAtIndexPath
中处理 selectedcellvalues
:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath)
if(cell?.accessoryType == UITableViewCellAccessoryType.None){
cell?.accessoryType = UITableViewCellAccessoryType.Checkmark
selectedCells.append(row:indexPath.row, section:indexPath.section)
}else{
var rowToDelete = indexPath.row
var sectionToDelete = indexPath.section
for var i=0; i < selectedCells.count; i++
{
if(rowToDelete == selectedCells[i].row && sectionToDelete == selectedCells[i].section){
selectedCells.removeAtIndex(i)
cell?.accessoryType = UITableViewCellAccessoryType.None
}
}
}
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}