0
嘗試創建一個UITableview與包含不同部分的複選框按鈕,我如何設法爲新節中的每個按鈕分配一個唯一的標記。由於indexpath.row將在每一個新的部分被重複,不能使用indexpath.row複選框與不同部分的UITableView
嘗試創建一個UITableview與包含不同部分的複選框按鈕,我如何設法爲新節中的每個按鈕分配一個唯一的標記。由於indexpath.row將在每一個新的部分被重複,不能使用indexpath.row複選框與不同部分的UITableView
實施例使用具有選中/取消背景圖像的UIButton
具有開/關狀態:
//
// TableWithCheckTableViewController.swift
// SWTemp2
//
// Created by Don Mag on 6/6/17.
// Copyright © 2017 DonMag. All rights reserved.
//
import UIKit
class MyCheckTableViewCell: UITableViewCell {
@IBOutlet weak var myLabel: UILabel!
@IBOutlet weak var myCheckButton: UIButton!
var checkedImage = UIImage(named: "Checked")
var unCheckedImage = UIImage(named: "UnChecked")
var isOn: Bool = false {
didSet {
myCheckButton.setBackgroundImage(self.isOn ? checkedImage : unCheckedImage, for: .normal)
}
}
var checkTapAction : ((Bool)->Void)?
@IBAction func buttonTapped(_ sender: Any) {
self.isOn = !self.isOn
checkTapAction?(self.isOn)
}
}
// simple data object
class MyCheckObject: NSObject {
var theTitle = ""
var theCheckState = false
init(_ title: String) {
theTitle = title
}
}
class TableWithCheckTableViewController: UITableViewController {
// array of MyObjects
var myData = [MyCheckObject]()
override func viewDidLoad() {
super.viewDidLoad()
// just to make it a little easier to see the rows scroll
tableView.rowHeight = 60
// create 40 data objects for the table
for i in 1...40 {
let d = MyCheckObject("Data Item: \(i)")
myData.append(d)
}
tableView.reloadData()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return myData.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCheckTableViewCell", for: indexPath) as! MyCheckTableViewCell
// Configure the cell...
let d = myData[indexPath.row]
cell.myLabel.text = d.theTitle
cell.isOn = d.theCheckState
// set a "Callback Closure" in the cell
cell.checkTapAction = {
(isOn) in
// update our Data Array to the new state of the switch in the cell
self.myData[indexPath.row].theCheckState = isOn
}
return cell
}
}
完美!令人驚訝的是如何工作,沒有更多的設置獨特的標籤和不需要的代碼 – Max
這是原因之一**不要**使用標籤來標識行。相反,您應該在「選中該複選框」時更新數據源。這樣,只要tableview重新加載該單元格(例如滾動後),就可以控制複選框的狀態。 – DonMag
下面是一個簡單的例子 - 它使用「UISwitch」而不是「複選框」......但它將幾乎完全相同:https://stackoverflow.com/questions/44369289/swift-3-uiswitch-in-tableviewcell - 失去狀態當滾動/ 44370083#44370083 – DonMag
我有UIButton,UISwitch確實有sender.isOn屬性,但只是一個UIButton與背景圖像變化 – Max