當我點擊indexpath.row == 0上的選擇按鈕或任何這樣的,只有相應的「會話標籤值」會改變,但在這裏不會發生。它會改變下面的單元格值,也就是indexpath == 7或8,我認爲這裏是單元格的重用,所以我可以如何避免它。如何避免tableview單元格的重用性?
我的代碼如下圖所示。
1.UITableViewCell類:
import UIKit
class DemoTableViewCell: UITableViewCell {
@IBOutlet weak var mSelectButton: UIButton!
@IBOutlet weak var mDateLabel: UILabel!
@IBOutlet weak var mSessionLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
視圖控制器類: -
進口的UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { var month_year = "" var fromYear = "" var toYear = "" var monthYearList = "" var monthYearListArray = [String]() let picker : UIDatePicker = UIDatePicker() var from_date = "" var to_date = "" // var selectedTagValue = Int() var aSheetValue = "" var isFromActionSheet = Bool() var isFromFinalClick = Bool() var intArray = [Int]() @IBOutlet weak var mTableView: UITableView! // MARK:- ViewController Life Cycle Methods override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { self.printDatesBetweenInterval(self.dateFromString("2017-07-01"), self.dateFromString("2017-07-12")) } //MARK:- UITableViewDataSource and Delegate Methods func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return monthYearListArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "DemoTableViewCell")! as! DemoTableViewCell cell.mDateLabel.text = monthYearListArray[indexPath.row] if isFromActionSheet{ if indexPath.row == selectedTagValue{ cell.mSessionLabel.text = aSheetValue isFromActionSheet = false } } cell.mSelectButton.tag = indexPath.row print("cell.mButtonOutlet.tag: \(cell.mSelectButton.tag)") cell.mSelectButton.addTarget(self, action: #selector(ViewController.actionOnSelectButtonClick(_:)), for: .touchUpInside) if isFromFinalClick{ if cell.mSessionLabel.text == "Full Day"{ self.intArray.append(1) }else if cell.mSessionLabel.text == "First Half"{ self.intArray.append(2) }else{ self.intArray.append(3) } } return cell } // MARK:- IBAction Methods func actionOnSelectButtonClick(_ sender: UIButton) { let mButton : UIButton = sender selectedTagValue = mButton.tag print("selectedTagValue: \(selectedTagValue)") isFromActionSheet = true openActionSheet() } // Submit Button @IBAction func actionOnSubmitButton(_ sender: Any) { isFromFinalClick = true mTableView.reloadData() print("intArray list: \(intArray)") } // MARK:- Instance Methods func openActionSheet() { // 1 let optionMenu = UIAlertController(title: nil, message: "Select Session", preferredStyle: .actionSheet) // 2 let fullDayAction = UIAlertAction(title: "Full Day", style: .default, handler: { (alert: UIAlertAction!) -> Void in print("Full Day") self.aSheetValue = "Full Day" self.mTableView.reloadData() }) let firstHalfAction = UIAlertAction(title: "First Half", style: .default, handler: { (alert: UIAlertAction!) -> Void in print("First Half") self.aSheetValue = "First Half" self.mTableView.reloadData() }) let secondHalfAction = UIAlertAction(title: "Second Half", style: .default, handler: { (alert: UIAlertAction!) -> Void in print("Second Half") self.aSheetValue = "Second Half" self.mTableView.reloadData() }) // let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: { (alert: UIAlertAction!) -> Void in print("Cancelled") }) // 4 optionMenu.addAction(fullDayAction) optionMenu.addAction(firstHalfAction) optionMenu.addAction(secondHalfAction) optionMenu.addAction(cancelAction) // 5 self.present(optionMenu, animated: true, completion: nil) } // MARK:- Date_List Method func printDatesBetweenInterval(_ startDate: Date, _ endDate: Date) { var startDate = startDate let calendar = Calendar.current let fmt = DateFormatter() fmt.dateFormat = "yyyy-MM-dd" while startDate <= endDate { print(fmt.string(from: startDate)) self.monthYearList = fmt.string(from: startDate) print("self.monthYearList: \(self.monthYearList)") fmt.dateFormat = "yyyy-MM-dd" monthYearListArray.append(fmt.string(from: startDate)) startDate = calendar.date(byAdding: .day, value: 1, to: startDate)! } print("monthYearListArray: \(monthYearListArray)") mTableView.reloadData() } func dateFromString(_ dateString: String) -> Date { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" return dateFormatter.date(from: dateString)! } }
感謝您的解決方案... –
但它不會工作多個值..當我選擇單元格在0 indexpath然後會話標籤值將設置propery,但是當我想更改單元格在indexpath = 2或3或4 .....它會改變在0索引路徑單元格的值....... 我不想要它.....所以我可以做...因爲它.. 。? –
再一次確保任何改變UI元素值的if條件都有一個else分支來指定默認值。這就像一個Swift switch表達式:這些案例必須是詳盡無遺的。 – vadian