Отсутствует возврат в функции, которая, как ожидается, вернет ‘UITableViewCell’, но фактически возвращает дважды

#ios #swift #uitableview

#iOS #swift #uitableview

Вопрос:

Я пытаюсь настроить табличное представление, которое будет изменять ячейки на основе сегментированного контроллера вверху. Однако при попытке изменить ячейки при перезагрузке tableview я получаю ошибку функции возврата, хотя на самом деле у меня есть функция возврата. Что я могу сделать, чтобы это исправить?

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




    if friendSelector.selectedSegmentIndex == 0 {
        print("0")

        cell = self.friendsTable.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! FriendsTableViewCell


        cell.nameLabel.text = friends[indexPath.row]
        cell.bacLabel.text = String(friendsBac[indexPath.row])
        cell.statusImageView.image = friendsImage[indexPath.row]

        return cell

    }

    if friendSelector.selectedSegmentIndex == 1 {
        print("1")

        celladd = self.friendsTable.dequeueReusableCell(withIdentifier: "celladd", for: indexPath) as! FriendsAddTableViewCell

        celladd.nameLabel.text = requested[indexPath.row]
        celladd.statusImageView.image = UIImage(named: "greenlight")

        return celladd


    }

}
  

Просмотр таблицы с двумя разными пользовательскими UITableViewCells

Комментарии:

1. Метод ничего не возвращает, если ваши оба условия не удовлетворяют.

Ответ №1:

Вы должны вернуть ячейку. В приведенном выше коде, если оба условия не выполнены, ничего не будет возвращено. Итак, появилось предупреждение. Просто удалите второе условие «if» и используйте else case следующим образом:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if friendSelector.selectedSegmentIndex == 0 {
        print("0")

        cell = self.friendsTable.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! FriendsTableViewCell


        cell.nameLabel.text = friends[indexPath.row]
        cell.bacLabel.text = String(friendsBac[indexPath.row])
        cell.statusImageView.image = friendsImage[indexPath.row]

        return cell

    }

    else {
        print("1")

        celladd = self.friendsTable.dequeueReusableCell(withIdentifier: "celladd", for: indexPath) as! FriendsAddTableViewCell

        celladd.nameLabel.text = requested[indexPath.row]
        celladd.statusImageView.image = UIImage(named: "greenlight")

        return celladd


    }

}
  

Комментарии:

1. Спасибо! Я не могу поверить, что пропустил это.

2. При использовании switch инструкции убедитесь, что каждый случай возвращает ячейку и что default случай либо возвращает ячейку, либо вызывает ошибку.

Ответ №2:

У вас есть два оператора if, оба из которых потенциально могут быть неверными, поэтому вы должны вернуть ячейку в случае, если выбранный индекс не равен ни 0, ни 1.

 if friendSelector.selectedSegmentIndex == 0 {
    ...
    return cell
}
else if friendSelector.selectedSegmentIndex == 1 {
    ...
    return celladd
}
return UITableViewCell()
  

Я предпочитаю использовать операторы switch для такого рода вещей.

 switch friendSelector.selectedSegmentIndex {
case 0:
    ...
    return cell
case 1:
    ...
    return celladd
default:
    return UITableViewCell()
}
  

Ответ №3:

Это очень очевидно. У вас есть два оператора return в двух условиях if. Что, если оба ваших условия ‘if’ не будут выполнены? Для этого случая нет оператора return. Вот почему компилятор жалуется