#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
}
}
Комментарии:
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. Вот почему компилятор жалуется