2015-07-27 1 views
1

Итак, у меня есть сегментированный элемент управления, который переключается между двумя табличными представлениями & 1 MapView внутри MainVC.Пользовательская ячейка для двух табличных экранов/сегментированного управления Swift

Я могу переключить представления в симуляторе, добавив функцию IBAction, измененнуюInSegmentedControl, чтобы переключать виды, которые скрыты, когда один из них активен.

Я создал 2 пользовательских TableViewCells с XIB. Я также добавил теги с каждым TableView.

Вопрос: как добавить их в cellForRowAtIndexPath?

В настоящее время мой код:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 
    // var cell: UITableViewCell 
    if (tableView.tag == 1) { 
     cell: CardTableViewCell = tableView.dequeueReusableCellWithIdentifier("CardCell") as! CardTableViewCell 
return cell 
     } 
    else if (tableView.tag == 2) { 
     cell: ListTableViewCell = tableView.dequeueReusableCellWithIdentifier("ListCell") as! ListTableViewCell 
return cell 
    } 
    } 

Конечно Swift требует «вернуть клетку» для функции вне операторов, если. Я попробовал с ячейкой var: UITableViewCell снаружи, но столкнулся с проблемой завершения обработки dequeuReusableCellWithIdentifier.

У кого-нибудь есть идея, как это сделать? Благодарю.

ответ

0

Я внесла изменения в ваш код. Используйте следующий код

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    if (tableView.tag == 1) { 

     cell: CardTableViewCell = tableView.dequeueReusableCellWithIdentifier("CardCell") as! CardTableViewCell 
     return cell 
    } 

    cell: ListTableViewCell = tableView.dequeueReusableCellWithIdentifier("ListCell") as! ListTableViewCell 
    return cell 
} 
+0

Я пробовал это раньше. Получил ошибку компилятора «Тип« UITableViewCell »не соответствует протоколу NilLiteralConvertible. – ckraider

+0

Обновленный ответ попробуйте это ... –

0

Это, как я подошел к ней (Swift 3.0 на прошивкой 10). Я сделал один tableView с двумя пользовательскими ячейками (каждый из них является их собственным подклассом). Сегментированный элемент управления находится на моем навигационном баре и имеет два сегмента: «Люди и места».

В моем классе (люди и места) есть два массива, которые являются источниками данных для двух табличных представлений. Действие, связанное с segmentedControl, запускает перезагрузку таблицы, а оператор switch в cellForRowAtIndex управляет той ячейкой, из которой загружен массив.

Я загружаю данные в два массива данных из вызова API, асинхронное завершение которых триггера dataLoaded(), которое перезагружает tableView. Опять же, мне не нужно беспокоиться о том, какой сегмент выбирается, когда таблица перезагружается: cellForRowAtIndex берет на себя сбор правильных данных. Я инициализирую базовую ячейку, как UITableViewCell, а затем в выражении case, который я создал, и настроил пользовательскую ячейку. Затем я возвращаю свою специальную ячейку типа в конце, и до тех пор, пока параметры повторного использования и классы верны в cellForRowAtIndex, правильная ячейка инициализируется и отображается в таблицеView.

@IBOutlet weak var tableView: UITableView! 
@IBOutlet weak var peoplePlacesControl: UISegmentedControl! 

fileprivate var placesArray: [PlaceModel]? 
fileprivate var usersArray: [UserModel]? 


@IBAction func segmentedControlActionChanged(_ sender: AnyObject) { 
    tableView.reloadData() 
    switch segmentedControl.selectedSegmentIndex { 
    case 0: 
     loadUsersfromAPI() 
    case 1: 
     loadPlacesFromAPI() 
    default: 
     // shouldnt get here 
     return 
    } 
} 


func dataLoaded() { 
    switch peoplePlacesControl.selectedSegmentIndex { 
    case 0: // users 
     if favoriteUsersArray == nil { 
      self.tableView.reloadData() 
     } else { 
      hideTableViewWhileEmpty() 
     } 
    case 1: // places 
     if placesArray != nil { 
      self.tableView.reloadData() 
     } else { 
      hideTableViewWhileEmpty() 
     } 
    default: 
     return 
    } 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    switch segmentedControl.selectedSegmentIndex { 
    case 0: 
     if usersArray != nil { 
      return usersArray!.count 
     } else { 
      return 0 
     } 
    case 1: // places 
     if placesArray != nil { 
      return placesArray!.count 
     } else { 
      return 0 
     } 
    default: 
     return 0 
    } 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    var cell = UITableViewCell() 
    switch peoplePlacesControl.selectedSegmentIndex { 
    case 0: // people 
     let userCell = tableView.dequeueReusableCell(withIdentifier: "MyUserCell", for: indexPath) as! MyUserTableViewCell 
     if usersArray != nil && indexPath.row < usersArray!.count { 
      let user = usersArray![indexPath.row] 
      userCell.configure(user) 
      userCell.myDelegate = self 
     } 
     cell = userCell as MyUserTableViewCell 

    case 1: // places 
     let placeCell = tableView.dequeueReusableCell(withIdentifier: "MyPlaceCell", for: indexPath) as! MyPlaceTableViewCell 

     if favoritePlacesArray != nil && indexPath.row < favoritePlacesArray!.count { 
      let place = placesArray![indexPath.row] 
      placeCell.configure(place) 
      placeCell.myDelegate = self 
     } 
     cell = placeCell as MyPlaceTableViewCell 

    default: 
     break 
    } 
    return cell 
} 

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

  • Нет связанных вопросов^_^