Отсутствует возврат в функции, которая, как ожидается, вернет «UITableViewCell»; пожалуйста, помогите мне

#swift

Вопрос:

контроллер просмотра расширения: UITableViewDelegate {

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    tableView.deselectRow(at: indexPath, animated: true)
    
    let vc = storyboard?.instantiateViewController(identifier: "tasks") as! TaskViewController
    vc.title = "New Tasks"
    vc.task = tasks[indexPath.row]
    navigationController?.pushViewController(vc, animated: true)
    //error:Missing return in a function expected to return 'UITableViewCell'
}
    
  }
 

Я пытаюсь различать типы возвращаемых данных, но ни один из них не является правильным

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

1. Создание экземпляра контроллера вида внутри cellForRow бессмысленно. Вы должны удалить из очереди и вернуть ячейку представления таблицы.

2. если вы пытаетесь открыть задачи «контроллер просмотра» при нажатии на ячейку, вместо этого используйте метод делегирования didSelectRow

Ответ №1:

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

Измененный код:

 extension ViewController: UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        /// Create a file for the cell let's say call it `myCell` with a label for task "let's suppose called `lblTaskOutlet`
        let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! myCell
        myCell.lblTaskOutlet = tasks[indexPath.row]
        
        return cell
        
    }
}
 

Вы можете добавить это vc.title = "New Tasks" в свой viewDidLoad() :

 self.title = "New Tasks"
 

Приведенная ниже строка-это еще одна функция, вызываемая наедине со своим собственным телом:

 tableView.deselectRow(at: indexPath, animated: true)
 

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

1. не могли бы вы рассказать более конкретно, пожалуйста??:(((

2. Хорошо, я изменю ответ

3. Ответ уже отредактирован, проверьте его @lekhoile

Ответ №2:

TableView(_ TableView: UITableView, cellForRowAt indexPath: indexPath) -> Метод UITableViewCell-это метод делегата tableview, который заполняет ячейки для каждой строки. Он ожидает возвращаемый тип UITableViewCell. Вы можете создать подкласс UITableViewCell TaskCell

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    /// Create a file for the cell let's say call it `TaskCell` with a object for task "let's suppose called `taskObj`
    let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath) as! TaskCell
    cell.taskObj = tasks[indexPath.row]
    return cell
}
 

Для действия щелчка по ячейке вам необходимо переопределить другой UITableViewDataSource метод.

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let vc = storyboard?.instantiateViewController(identifier: "tasks") as! TaskViewController
    vc.title = "New Tasks"
    vc.task = tasks[indexPath.row]
    navigationController?.pushViewController(vc, animated: true)
}
 

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

 override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.delegate = self
    self.tableView.dataSource = self
}