2016-04-27 87 views
1

以前我有一個問題,在tableview節標題單元格中有一個UISegmentedControl,我想在主視圖控制器中監聽值更改。UISegmentedControl在值更改時不選擇

我通過在tableView:viewForHeaderInSection方法的UISegmentedControl上使用addTarget解決了這個問題,並且這可以工作。

第一段是默認選擇,這是有效的。當點擊第二段時,它會用其他數據重新加載tableview,這是預期的行爲。但是,第一部分仍然被選中。這意味着我無法切換回表格視圖中的原始數據。

Please see this video你會看到我想解釋的。

我找不出我的代碼出了什麼問題?

/* 
* Main View Controller 
*/ 
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

    if section == 0 { 
     return nil 
    } 

    let sectionCell = tableView.dequeueReusableCellWithIdentifier("SegmentCell") as! SegmentTableViewCell 

    // Add event for the UISegmentedControl 
    sectionCell.segmentControl.addTarget(self, action: #selector(self.handleSegmentControlEvent), forControlEvents: .ValueChanged) 

    return sectionCell 
} 

func handleSegmentControlEvent(sender: UISegmentedControl) { 
    self.segmentControlIndex = sender.selectedSegmentIndex 

    switch (sender.selectedSegmentIndex) { 

     case 0: 
      if latestTableData.count == 0 { 
       loadItems("latest") 
      } else { 
       tableView.reloadData() 
      } 
      break 

     case 1: 
      if closestTableData.count == 0 { 
       loadItems("closest") 
      } else { 
       tableView.reloadData() 
      } 
      break; 

     default: 
      break 
    } 
} 

/* 
* Segment table view cell 
*/ 
class SegmentTableViewCell: UITableViewCell { 

    @IBOutlet weak var segmentControl: UISegmentedControl! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
    } 
} 

我看不到我做錯了什麼?

+1

如果你重新加載表視圖,它也重新加載標題視圖。所以分段控制重新初始化爲以前的狀態。 –

+0

謝謝@SuryaSubenthiran!這使得很多的意義..是否有一些方法只重新加載特定的部分? –

+0

更好的使用標誌來保存段的當前狀態,並在初始化時使用該標誌來設置段的狀態。 –

回答

2

當tableView被重新加載時,意味着viewForHeaderInSection也被重新加載。因此,它是得了初期reloading.So後,你應該爲它選擇不同的方式一樣,你可以在實現代碼如下外面加分段控制不如headerview或重裝只有行或單元格等

例如,

[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationLeft]; 

更新:

重裝部分,

NSRange range = NSMakeRange(0, 1); 
NSIndexSet *section = [NSIndexSet indexSetWithIndexesInRange:range];          
[self.tableView reloadSections:section withRowAnimation:UITableViewRowAnimationNone]; 

這將重新加載的第一s-撓度。欲瞭解更多詳細信息,你可以參考this link

它是客觀的c代碼轉換在迅速!

希望這會有所幫助:)

+0

這還包括標題視圖,是否正確?是否有一些方法只用於重新加載特定部分? –

+0

檢查我的答案ti update部分中的更新 – Lion