2016-01-26 3 views
0

У меня есть UITableView, в котором для некоторых ячеек я программно добавляю UISwitch в качестве вспомогательного элемента. Для метода делегата didSelectRowAtIndexPath Я использую следующее: tableView.deselectRowAtIndexPath(indexPath, animated: true) немедленно, если ячейка имеет собственный класс. Я выполняю некоторые дополнительные действия (разворачивание/сведение). UISwitch не имеет пользовательского класса, это вспомогательное окно обычной ячейки, поэтому tableView.deselectRowAtIndexPath(indexPath, animated: true) выполняется при нажатии на ячейку, и это все. Проблема в том, что с ячейками, которые имеют UISwitch в качестве accessView, если вы переключаете переключатель вкл/выкл, он работает нормально - но второй вы нажимаете в другом месте в одной ячейке, он остается выделенным, и приложение зависает. Почему это происходит и как я могу это предотвратить?UISwitch в UITableViewCell замерзает приложение, когда ячейка выбрана, не замерзает при переключении UISwitch

didSelectRowAtIndexPath Функция:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     tableView.deselectRowAtIndexPath(indexPath, animated: true) 

     // Deselect automatically if the cell is a DatePickerCell/PickerCell. 
     let cell = self.tableView(tableView, cellForRowAtIndexPath: indexPath) 

     if (cell.isKindOfClass(DatePickerCell)) { 

      let datePickerTableViewCell = cell as! DatePickerCell 
      datePickerTableViewCell.selectedInTableView(tableView) 
      tableView.deselectRowAtIndexPath(indexPath, animated: true) 

     } else if(cell.isKindOfClass(PickerCell)) { 

      let pickerTableViewCell = cell as! PickerCell 
      pickerTableViewCell.selectedInTableView(tableView) 
      tableView.deselectRowAtIndexPath(indexPath, animated: true) 

     } 
} 

И я установить переключатели следующим образом: функция

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

      let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as UITableViewCell 
      let row = indexPath.row 

      allDaySwitch.on = false 
      gstSwitch.on = false 

      //Assigns UISwitch cells and UITextField cells 
      if(indexPath.section == 0) { 

       let rowTitle = mainOptions[row] 
       cell.textLabel?.text = rowTitle 
       cell.accessoryView = nil 

      } else if(indexPath.section == 1) { 

       let rowTitle = dateOptions[row] 

       if(rowTitle == "All Day") { 
        cell.accessoryView = allDaySwitch 
       } else { 
        cell.accessoryView = nil 
       } 

       cell.textLabel?.text = rowTitle 

      } else if(indexPath.section == 2) { 

       let rowTitle = alertOptions[row] 
       cell.accessoryView = nil 
       cell.textLabel?.text = rowTitle 

      } else { 

       let rowTitle = billingOptions[row] 

       if(rowTitle == "Tax Included") { 
        cell.accessoryView = gstSwitch 
       } else { 
        cell.accessoryView = nil 
       } 

       cell.textLabel?.text = rowTitle 
      } 

      return cell 
    } 

selectedInTableView:

public func selectedInTableView(tableView: UITableView) { 
     expanded = !expanded 

     UIView.transitionWithView(rightLabel, duration: 0.25, options:UIViewAnimationOptions.TransitionCrossDissolve, animations: {() -> Void in 
      self.rightLabel.textColor = self.expanded ? self.tintColor : self.rightLabelTextColor 
      }, completion: nil) 

     tableView.beginUpdates() 
     tableView.endUpdates() 
} 

ответ

1

Вы не должны вызывать cellForRowAtIndexPath в вашем didSelectRowAtIndexPath , он уже настроен в вашем dataSource способ. Похоже, вы используете статические ячейки в своем cellForRowAtIndexPath, вы можете легко сделать то же самое для didSelectRowAtIndexPath.

switch indexPath.row { 
    case 0: 
     // do Something 
    case 1: 
     // do Something 
    default: break 
} 

Кроме того, проблема в том, что вы передаете в tableView, который на самом деле не быть доступны правильно по UITableViewCell. beginUpdates и endUpdates должны быть вызваны на ваш контроллер просмотра, так как ваш UITableViewCell не имеет понятия (и не заботится) о том, что происходит в вашем самом TableView.

+0

Но мне нужно, чтобы оно выполняло определенные действия в зависимости от типа ячейки, поскольку у меня есть классы клиентов для определенных ячеек. Так вот как я могу сравнить @jasonnoahchoi – coopwatts

+0

, как выглядит ваш 'selectedInTableView' в datePickerCell? – jasonnoahchoi

+0

Я обновил проводку, чтобы включить эту функцию. – coopwatts

Смежные вопросы