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



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




  • Cell1: должен иметь изображение и надпись.

  • Cell2: должно быть две метки.

  • Cell3: должен иметь dayPicker.


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



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

646   4  

4 ответов:

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

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

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

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

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

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

enter image description here

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

enter image description here

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

enter image description here

enter image description here

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

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

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

Итак, в FirstCustomTableViewCell.Свифт, под

class FirstCustomTableViewCell: UITableViewCell {

вы положили бы ваши выходы взгляда ярлыка и изображения.

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

и в SecondCustomTableViewCell.Свифт, добавьте две метки типа -

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.Свифт должен выглядеть так-

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, создайте выход для вашего TableView и установите соединение из раскадровки. Кроме того, необходимо добавить UITableViewDelegate и UITableViewDataSource в определение класса в качестве списка протоколов. Итак, ваше определение класса должно выглядеть так-

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

после этого прикрепите UITableViewDelegate и UITableViewDatasource вашего табличного представления к контроллеру. На данный момент ваш viewController.Свифт должен выглядеть так-

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: перетащите изображения и метки в ячейке в соответствии с классом ячейки. а затем обеспечить подключение к своим розеткам из раскадровки.

Шаг 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()
    }
}

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

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

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

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

enter image description here

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

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

class FirstTableCell: UITableViewCell {
}

class SecondTableCell: UITableViewCell {
}

class ThirdTableCell: UITableViewCell {   
}

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

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

enter image description here

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

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

enter image description here

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. Дайте ему попробовать :)

enter image description here

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

моя проблема заключалась в том, что я разделял класс 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)

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

UITableViewController наследует UIViewController что уже есть UITableviewDataSource & UITableviewDelegate отображенный на себя.

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

также в раскадровке вам нужно создать прототипы ячеек с уникальным идентификатором.

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

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

Comments

    Ничего не найдено.