2017-07-04 38 views
-1

當我點擊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 
    } 
} 
  1. 視圖控制器類: -

    進口的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)! 
         } 
    
        } 
    

回答

6

而不是避免重複使用細胞確保所有UI元素總是在一個明確的st吃了

if isFromActionSheet && indexPath.row == selectedTagValue{ 
    cell.mSessionLabel.text = aSheetValue 
    isFromActionSheet = false 
} else { 
    cell.mSessionLabel.text = [default value] 
    isFromActionSheet = [default value] 
} 
+0

感謝您的解決方案... –

+0

但它不會工作多個值..當我選擇單元格在0 indexpath然後會話標籤值將設置propery,但是當我想更改單元格在indexpath = 2或3或4 .....它會改變在0索引路徑單元格的值....... 我不想要它.....所以我可以做...因爲它.. 。? –

+0

再一次確保任何改變UI元素值的if條件都有一個else分支來指定默認值。這就像一個Swift switch表達式:這些案例必須是詳盡無遺的。 – vadian

0

要做的正確的事情是,你需要總是設置這些UI元素在cellForRow

原因是UITableView不準備顯示錶格視圖單元格,直到用戶試圖滾動到該位置(即當用戶試圖查看該單元格時)。因此,重複使用單元格的想法是將一些單元格模板保留在重用位置,以便下次您的手機不需要再次從頭開始創建所有內容。唯一需要做的是將單元再次設置爲正確的狀態。這也將使滾動更平滑。

通過設置UI元素,我的意思是你每次都值設置爲你的UI元素上你的當你cellForRow方法被調用。看看這塊代碼的

if isFromActionSheet{//What if this if is not called? Your cell.mSessionLabel will not get set 
    if indexPath.row == selectedTagValue{//What if this if is not called? Your cell.mSessionLabel will not get set 
     cell.mSessionLabel.text = aSheetValue 
     isFromActionSheet = false 
    } 
} 

如果二者中的任何if語句是不正確的,那麼你的mSessionLabel你的細胞不會得到新的價值,並可以顯示其他一些值,從樣板單元。所以你必須創建兩個else語句,在兩個else語句中添加set mSessionLabel。

+0

如何設置UI元素,如果可能的話u能告訴我細節? 感謝答...... –

+0

@Kiranjadhav更新 –

+0

確定.. 感謝.... –

相關問題