2016-04-27 2 views
1

Раньше у меня была проблема с ячейкой заголовка раздела UISegmentedControl в tableview, и я хотел прослушать изменения значений в главном контроллере представления.UISegmentedControl не выбирает, когда изменяется значение

Я получил это решение, используя addTarget в UISegmentedControl в методе tableView:viewForHeaderInSection, и это работает.

Первый сегмент по умолчанию выбран, и это работает. При нажатии второго сегмента он перезагружает таблицу с другими данными, что является ожидаемым поведением. Однако первый сегмент все еще выбран. Это означает, что я не могу вернуться к исходным данным в виде таблицы.

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 Вы должны выбрать другой подход к ней, как вы можете добавить сегментированный контроль за пределы Tableview не как headerview или перезагружать только строку или ячейку и т.д.

, например,

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

Update:

перезарядка раздел,

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

Это перезагрузит первые сек прогиб. Более подробную информацию вы можете получить this link

это объектив c конвертировать код в быстром!

надеюсь, что это поможет :)

+0

Это включает также заголовок, правильно? Есть ли какой-нибудь метод только для перезагрузки определенного раздела? –

+0

Проверить обновление в моем ответе ti reload разделы – Lion