2016-04-27 61 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