Пользовательская ячейка iOS TableView ничего не показывает - PullRequest
0 голосов
/ 19 сентября 2018

Я новичок в iOS и Swift и пытаюсь немного научиться, создав простое приложение Todo.Проблема, с которой я столкнулся, заключается в том, что независимо от того, как я реализую код (следуя нескольким учебникам) и раскадровки, данные не отображаются, а настраиваемые ячейки не настраиваются (выглядит точно так, как выглядят ячейки по умолчанию, даже если я настроил).Это).Я уже подключил свои delegate и dataSource

Редактировать: Я уже назначил идентификатор повторного использования

TodosView.swift

import UIKit

class TodosView: UIViewController {
    @IBOutlet weak var todosTable: UITableView!

    var todos: [Todo] = []

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

        self.addTodo()
    }

    func addTodo() {
        let todo1 = Todo(text: "My first todo")
        let todo2 = Todo(text: "My second todo")

        todos = [todo1, todo2]
    }
}

extension TodosView: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return todos.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let todo = todos[indexPath.row]
        let cell = tableView.dequeueReusableCell(withIdentifier: "TodoCell") as! TodoCell

        cell.setTodo(todo: todo)

        return cell
    }
}

TodoCell.swift

import UIKit

class TodoCell: UITableViewCell {
    @IBOutlet weak var todoText: UILabel!

    func setTodo(todo: Todo) {
        todoText.text = todo.text
    }
}

Todo.swift

import Foundation

struct Todo {
    var text: String
    var done: Bool

    init(text: String, done: Bool = false) {
        self.text = text
        self.done = done
    }
}

Ответы [ 4 ]

0 голосов
/ 19 сентября 2018

Вы можете использовать это

func addTodo() {
   let todo1 = Todo(text: "My first todo")
   let todo2 = Todo(text: "My second todo")
   todos = [todo1, todo2]
   DispatchQueue.main.async {
      self.todosTable.reloadData()
   }
}

Это может помочь вам

0 голосов
/ 19 сентября 2018

Мне удалось использовать ваш код для успешной генерации ваших строк Todo (я не reloadData() после вызова addTodo());

enter image description here

Доказав, что ваш код работает, я могу поверить, что у вас есть проблема где-то в настройках раскадровки, более того, чем в самом коде.Несколько предложений:

Убедитесь, что ваша пользовательская ячейка имеет подклассы TodoCell .Вы можете сделать это, нажав на TodoCell в Интерфейсном Разработчике, и на вкладке Identity Inspector убедитесь, что у вас установлено значение TodoCell:

enter image description here

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

Убедитесь, что вы установили идентификатор ячейки в Интерфейсном Разработчике .Снова нажмите на TodoCell в Интерфейсном Разработчике, перейдите на вкладку Инспектор атрибутов и убедитесь, что для идентификатора установлено значение TodoCell:

enter image description here

Также убедитесь, что вы действительно подключили свой tableView и todoText UILabel к своему коду.Я вижу, что у вас есть @IBOutlets для этих элементов, но если вы копировали и вставляли из учебника, возможно, вы набирали элементы и никогда не связывали их.Серый кружок рядом с вашим IBOutlet для tableView и UILabel должен быть заполнен следующим образом:

enter image description here

Если он пуст, у вас может не бытьсвязь, которая могла бы объяснить проблему.Опять же, я скопировал и вставил ваш код дословно и установил вещи в соответствии с вышеуказанными предложениями;Я не верю, что reloadData() или установка количества разделов помогут решить эту проблему (поскольку в вашем коде их нет, и он работает на моем конце).

0 голосов
/ 19 сентября 2018

Вы добавляете данные в array после создания tableView.

Измените эту строку:

var todos: [Todo] = []

на

var todos: [Todo]! {
    didSet {
        self.todosTable.reloadData()
    }
}

и вnumberOfRowsInSection:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    guard (todos != nil) else {
        return 0
    }
    return todos.count
}
0 голосов
/ 19 сентября 2018

Вам необходимо перезагрузить табличное представление после обновления источника данных: -

func addTodo() {
    let todo1 = Todo(text: "My first todo")
    let todo2 = Todo(text: "My second todo")
    todos = [todo1, todo2]
    todosTable.reloadData()
}

Редактировать Я также заметил, что, посмотрев на комментарий JWC, вы не реализовали метод numberOfSection, поэтомуВы также должны добавить номер метода делегата секции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...