UITableview с более чем одной пользовательской ячейкой с Swift

Я хочу использовать UITableview с разными пользовательскими таблицами. Мои 3 ячейки таковы:

  • Cell1: должен иметь изображение и метку.
  • Cell2: должен иметь две метки.
  • Cell3: должен иметь dayPicker.

Я не хочу кодировать тег для ячеек. Как я могу управлять этим в Swift. Должен ли я кодировать свой собственный класс для каждой ячейки? Можно ли использовать один tableviewController? Как я могу заполнить данные в разных ячейках?

Я хотел бы создать tableView, как приложение-контакт для iOS-устройства.

Ответ 1

Позвольте мне сначала ответить на ваши вопросы.

Нужно ли мне кодировать собственный класс для каждой ячейки? = > Да, я так считаю. По крайней мере, я бы сделал это.

Можно ли использовать один tableviewController? = > Да, вы можете. Тем не менее, вы также можете иметь представление таблицы внутри вашего контроллера просмотра.

Как я могу заполнить данные в разных ячейках? = > В зависимости от условий вы можете заполнять данные в разных ячейках. Например, предположим, что вы хотите, чтобы ваши первые две строки были похожими на ячейки первого типа. Таким образом, вы просто создаете/повторно используете ячейки первого типа и устанавливаете данные. Это будет более ясно, когда я покажу вам снимки экрана, я думаю.

Позвольте мне привести пример с TableView внутри ViewController. Как только вы поймете основную концепцию, вы можете попробовать и изменить все, что захотите.

Шаг 1: Создайте 3 пользовательских TableViewCells. Я назвал его, FirstCustomTableViewCell, SecondCustomTableViewCell, ThirdCustomTableViewCell. Вы должны использовать более значимые имена.

enter image description here

Шаг 2. Перейдите на Main.storyboard и перетащите TableView внутри своего контроллера просмотра. Теперь выберите вид таблицы и перейдите к инспектору идентификации. Установите "Prototype Cells" на 3. Здесь вы просто сказали своему TableView, что у вас могут быть 3 разных типа ячеек.

enter image description here

Шаг 3: Теперь выберите первую ячейку в TableView и инспекторе идентификации, поставьте "FirstCustomTableViewCell" в поле "Пользовательский класс", а затем установите идентификатор как "firstCustomCell" в инспекторе атрибутов.

enter image description here

enter image description here

Сделайте то же самое для всех остальных. Установите свои пользовательские классы как "SecondCustomTableViewCell" и "ThirdCustomTableViewCell" соответственно. Также установите идентификаторы как secondCustomCell и thirdCustomCell последовательно.

Шаг 4. Редактирование пользовательских классов ячеек и добавление точек в соответствии с вашими потребностями. Я отредактировал его по вашему вопросу.

P.S: Вам нужно поместить выходы под определение класса.

Итак, в FirstCustomTableViewCell.swift под

class FirstCustomTableViewCell: UITableViewCell {

вы бы поместили свои метки и изображения в виде изображений.

 @IBOutlet weak var myImageView: UIImageView!
 @IBOutlet weak var myLabel: UILabel!

и в SecondCustomTableViewCell.swift добавьте две метки, такие как -

import UIKit

class SecondCustomTableViewCell: UITableViewCell {

    @IBOutlet weak var myLabel_1: UILabel!
    @IBOutlet weak var myLabel_2: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

а ThirdCustomTableViewCell.swift должен выглядеть как

import UIKit

class ThirdCustomTableViewCell: UITableViewCell {

    @IBOutlet weak var dayPicker: UIDatePicker!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

Шаг 5: В вашем ViewController создайте Outlet для TableView и установите соединение из раскадровки. Кроме того, вам необходимо добавить UITableViewDelegate и UITableViewDataSource в определение класса в качестве списка протоколов. Итак, ваше определение класса должно выглядеть так:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

После этого присоедините UITableViewDelegate и UITableViewDatasource вашего представления таблицы к вашему контроллеру. В этот момент ваш viewController.swift должен выглядеть как

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

P.S: Если вы должны использовать TableViewController, а не TableView внутри ViewController, вы могли бы пропустить этот шаг.

Шаг 6: Перетащите изображения и метки изображений в ячейке в соответствии с классом Cell. а затем обеспечить подключение к своим выходам из раскадровки.

Шаг 7: Теперь напишите требуемые методы UITableViewDatasource в контроллере представления.

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        if indexPath.row == 0 {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "firstCustomCell")
            //set the data here
            return cell
        }
        else if indexPath.row == 1 {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "secondCustomCell")
            //set the data here
            return cell
        }
        else {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "thirdCustomCell")
            //set the data here
            return cell
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

Ответ 2

Обновление Swift 3.0 с минимальным кодом

Основная концепция: Создайте представление таблицы с динамическими сотовыми прототипами. Назначьте идентификатор и создайте собственный класс ячеек таблицы для каждого прототипа ячейки. Инициируйте и покажите пользовательские ячейки в методе делегата таблицы.

1. Создание ячеек в раскадровке

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

введите описание изображения здесь

2. Создайте пользовательские классы UITableViewCell

Добавьте следующий код в свой проект. Я помещаю это прямо над классом контроллера вида.

class FirstTableCell: UITableViewCell {
}

class SecondTableCell: UITableViewCell {
}

class ThirdTableCell: UITableViewCell {   
}

3. Назначить пользовательский класс и идентификатор прототипам соты

Для каждого из прототипов соты в раскадровке назначьте пользовательский класс, созданный с шага 2, а затем введите уникальный идентификатор.

введите описание изображения здесь

4. Подключите элементы пользовательского интерфейса к быстрому коду

Управляйте перетаскиванием таблицы и подключайтесь к классу контроллера вида. Элемент управления перетаскивает элементы пользовательского интерфейса, которые добавляются к прототипам соты на шаге 1 и подключаются к соответствующему классу ячеек таблицы.

введите описание изображения здесь

5. Добавить код для просмотра контроллера и управления представлением таблицы

Сделайте свой контроллер просмотра совместимым с делегатом представления таблицы

class YourViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

В viewDidLoad настройте делегат представления таблицы и источник данных.

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.dataSource = self
    self.tableView.delegate = self

}

Наконец, добавьте два метода делегата для управления табличным представлением в соответствии с минимальным требованием.

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "firstTableCell") as! FirstTableCell
        // Set up cell.label
        return cell
    } else if indexPath.row == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "secondTableCell") as! SecondTableCell
        // Set up cell.button
        return cell
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "thirdTableCell") as! ThirdTableCell
        // Set up cell.textField
        return cell
    }
}

6. Попробуйте:)

введите описание изображения здесь

Ответ 3

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

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

Я делал это:

let viewControllerB = SubViewController()
viewControllerB.passedData = diseases[indexPath.row].name
navigationController?.pushViewController(viewControllerB, animated: true)

И мне нужно было сделать что-то вроде этого:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "SubViewStoryboardController") as! SubViewController
nextViewController.passedData = diseases[indexPath.row].name
self.present(nextViewController, animated:true, completion:nil)

Надеюсь, это поможет кому-то.

Ответ 4

UITableViewController наследует UIViewController, который уже имеет UITableviewDataSource и UITableviewDelegate.

Вы можете подклассифицировать UITableViewController или использовать TableView внутри своего ViewController. После этого вы должны реализовать требуемые методы (cellForRowAtIndexPath and numberOfRowsInSection), которые объявлены в UITableviewDataSource.

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

Существуют базовые типы ячеек, например (название, субтитры) - вы также можете использовать их, если вам не нужна специальная настройка.

Итак, для сборщика, да, вам нужно создать свою собственную пользовательскую ячейку. Создайте необходимый пользовательский UITableViewCell выбор даты размещения класса и не забудьте использовать делегат для возврата желаемого результата обратно на ViewController.