UITableview с более чем одной пользовательской ячейки с Swift
Я хочу использовать UITableview с различными пользовательскими tableViewCells. Мои 3 клетки как таковой:
- Cell1: должен иметь изображение и надпись.
- Cell2: должно быть две метки.
- Cell3: должен иметь dayPicker.
Я не хочу кодировать тег для ячеек. Как я могу управлять этим в Swift. Должен ли я кодировать свой собственный класс для каждой ячейки? Могу ли я использовать один tableviewController? Как я могу заполнить данные в разных клетки?
Я хотел бы создать tableView, как контактное приложение устройства iOS.
4 ответов:
позвольте мне сначала ответить на ваши вопросы.
должен ли я кодировать собственный класс для каждой ячейки?=> Да, я так считаю. По крайней мере, я бы так поступил.
могу ли я использовать один tableviewController?=> Да, можно. Однако вы также можете иметь табличное представление внутри контроллера вида.
как я могу заполнить данные в разных ячейках? => В зависимости от условий, вы можете заполнить данные в разных ячейках. Например, предположим, что вы хотите, чтобы ваш первый две строки, чтобы быть похожим на первый тип ячеек. Итак, вы просто создаете/повторно используете первый тип ячеек и устанавливаете его данные. Это будет более ясно, когда я покажу вам снимки экрана, я думаю.
позвольте мне привести вам пример с TableView внутри ViewController. Как только вы поймете основную концепцию, вы можете попробовать и изменить ее в любом случае.
Шаг 1: Создайте 3 Пользовательских TableViewCells. Я назвал его FirstCustomTableViewCell, SecondCustomTableViewCell, ThirdCustomTableViewCell. Вы следует использовать более значимые имена.
Шаг 2: Перейти к главному.раскадровки и перетащите TableView для внутри вашего контроллера представления. Теперь выберите представление таблицы и перейдите к инспектору идентификации. Установите для параметра "ячейки прототипа" значение 3. Здесь вы только что сказали своему TableView, что у вас может быть 3 разных типа ячеек.
Шаг 3: Теперь выберите 1-ю ячейку в вашем TableView и в инспекторе идентификации, поместите "FirstCustomTableViewCell "в поле пользовательский класс, а затем установите идентификатор как" firstCustomCell " в инспекторе атрибутов.
сделайте то же самое для всех остальных - установите их пользовательские классы как "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 в контроллер представления, добавьте в него ячейки прототипа, а затем поместите элемент пользовательского интерфейса в ячейки представления таблицы, добавить ограничение правильно, если это необходимо.
2. Создать пользовательский
UITableViewCellклассыдобавьте следующий код в свой проект. Я ставлю его прямо над классом контроллера вида.
class FirstTableCell: UITableViewCell { } class SecondTableCell: UITableViewCell { } class ThirdTableCell: UITableViewCell { }3. Назначьте пользовательский класс и идентификатор прототипам ячеек
для каждого прототипа ячейки в раскадровке назначьте пользовательский класс, созданный на Шаге 2, а затем введите уникальный идентификатор.
4. Подключите элементы пользовательского интерфейса к swift-коду
управление перетащите представление таблицы и подключитесь к классу контроллера вида. Управление перетащите элементы пользовательского интерфейса, которые добавляются в прототипы ячеек на шаге 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. Дайте ему попробовать :)
приведенные выше ответы являются лучшими ответами, но есть множество причин, чтобы получить эту проблему. Вот еще одно потенциальное решение для тех, кто с этой проблемой:
моя проблема заключалась в том, что я разделял класс 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