Я создаю представление для доступа к настройкам в приложении, которое будет представлено в UITableView
. Некоторые клетки будут иметь UITableViewCellAccessoryDisclosureIndicator
, мне нужен с UISwitch
, а другой с UISegmentedControl вроде этого:Как использовать разные стили ячеек в UITableView
Другими словами, я думаю, что нужно пользовательские ячейки. Благодаря большому количеству исследований я получил довольно близко, но я не могу подключить все, что я научился, работать вместе. Вот что я сделал:
Созданы три UITableViewCell класса:
class DisclosureCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
class func defaultIdentifier() -> String {
return NSStringFromClass(self)
}
}
class SegmentedControlCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
class func defaultIdentifier() -> String {
return NSStringFromClass(self)
}
}
class SwitchCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
class func defaultIdentifier() -> String {
return NSStringFromClass(self)
}
}
У меня есть класс разделов и раздел структура, которая обеспечит секцию просмотра таблицы и каждый выбор доступный:
class SettingsData {
func getSectionsFromData() -> [Section] {
var settings = [Section]()
let preferences = Section(title: "OPTIONS", objects: ["Formulas", "Lifts", "Units", "Allow 15 reps"])
let patronFeatures = Section(title: "PATRON FEATURES", objects: ["Support OneRepMax"])
let feedback = Section(title: "FEEDBACK", objects: ["Send Feedback", "Please Rate OneRepMax"])
settings.append(preferences)
settings.append(patronFeatures)
settings.append(feedback)
return settings
}
}
struct Section {
var sectionHeading: String
var items: [String]
init(title: String, objects: [String]) {
sectionHeading = title
items = objects
}
}
Наконец, мой UITableViewController
:
class SettingsViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.topItem?.title = "Settings"
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(self.dismissSettings(_:)))
}
func dismissSettings(sender: AnyObject?) {
self.dismissViewControllerAnimated(true, completion: nil)
}
// MARK: - Table view data source
var sections: [Section] = SettingsData().getSectionsFromData()
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return sections.count
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return sections[section].items.count
}
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sections[section].sectionHeading
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("DisclosureCell", forIndexPath: indexPath)
cell.textLabel?.text = sections[indexPath.section].items[indexPath.row]
return cell
}
Я думаю, что т мне нужна помощь с:
- Как я создаю каждую клетку, как определить, какой из трех моих типов каждая клетка таким образом я могу отобразить их в зависимости от типа, а также Dequeue каждого типа правильно
- I создал
func defaultIdentifier() -> String
в каждом пользовательском классе И указал идентификаторы повторного использования в раскадровке для каждого типа ячейки. Нужно ли мне обоим? - Мне нужно зарегистрировать эти ячейки или это не нужно, потому что я использую раскадровку?
Я нашел много потоков по этому предмету, но либо они находятся в Objective-C, и/или они не говорят с конкретными частями, на которые я, похоже, застрял.
Спасибо!
UPDATE:
Я обновил мой override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
следующим образом:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellIdentifier = tableView.cellForRowAtIndexPath(indexPath)?.reuseIdentifier
if cellIdentifier == "DisclosureCell" {
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "DisclosureCell")
cell.textLabel?.text = sections[indexPath.section].items[indexPath.row]
return cell
} else if cellIdentifier == "SegmentedControlCell" {
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "SegmentedControlCell")
cell.textLabel?.text = sections[indexPath.section].items[indexPath.row]
return cell
}
else {
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "SwitchCell")
cell.textLabel?.text = sections[indexPath.section].items[indexPath.row]
return cell
}
}
Я надеюсь, что это шаг в правильном направлении, но я до сих пор не хватает что-то, потому что я получаю эту ошибку :
2016-07-28 07: 15: 35,894 Один Rep Макс [982: 88043] Нагрузочного приложение из-за неперехваченное исключение «NSRangeExcept ион», причина:" - [__ NSArrayI objectAtIndex]: индекс 2 за пределами [0 .. 0]
И мне нужно, чтобы выяснить способ для каждой ячейки, чтобы узнать, какой из трех типов он СЛЕДУЕТ быть, тогда, основываясь на том, какой тип он есть, я могу настроить его в коде выше.
UPDATE 2 Я теперь получил это вид работы, используя indexPath.row
:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CustomTableViewCell", forIndexPath: indexPath) as! CustomTableViewCell
if indexPath.row == 0 {
cell.selectionStyle = .None
cell.textLabel!.text = sections[indexPath.section].items[indexPath.row]
cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
return cell
} else if indexPath.row == 1 {
cell.selectionStyle = .None
cell.textLabel!.text = sections[indexPath.section].items[indexPath.row]
//cell.accessoryView = useAuthenticationSwitch
let switchView: UISwitch = UISwitch()
cell.accessoryView = switchView
switchView.setOn(false, animated: false)
return cell
} else {
cell.selectionStyle = .None
cell.textLabel!.text = sections[indexPath.section].items[indexPath.row]
let segmentedControl: UISegmentedControl = UISegmentedControl(items: ["lbs", "kg"])
segmentedControl.selectedSegmentIndex = 0
segmentedControl.addTarget(self, action: nil, forControlEvents: .ValueChanged)
cell.accessoryView = segmentedControl
return cell
}
}
Проблема заключается в том, что с помощью indexPath.row
, не все строки имеют правильный accessoryView
. В приведенном выше примере я хочу, чтобы первые две строки имели disclosureIndicators
, третий - UISegmentedControl
, а четвертый - UISwitch
. Теперь, я полностью понимаю, почему мой код производит это - это потому, что accessoryView
определяется положением ячейки. Вместо этого я хочу сказать каждую ячейку, когда она создается: «Вы - ячейка для этой настройки, поэтому вы получаете [заполнение пробела] accessoryView
». У меня есть пользовательские классы ячеек, созданные для каждого типа, и пытались сделать то, что я пытаюсь сделать с ними, но не могли понять. Вы можете заметить, что в приведенном выше коде я перешел к одному пользовательскому классу ячеек и повторному использованию идентификатора.
Я полагаю, что мог бы делать такие вещи, как if indexPath.row == 0 | 1 { blah, blah }
, но этот подход не будет задерживаться через каждые section
. Если я попытаюсь разобраться с каждым section
, то этот код станет более грязным, чем он есть. Должен быть умнее.
Есть ли?
Посмотрите на мой ответ на аналогичный вопрос здесь: http://stackoverflow.com/questions/38565089/multiple-cutsom-cells-in-uitableview/38565553#38565553. Ответ в объективе c, но это даст вам представление о том, как достичь того, что вы ищете. Вы можете легко реализовать его в Swift. –
Одиночная ячейка достаточно –
Я не очень разбираюсь в TableView. Но я думаю, что это поможет вам. выберите tableViewController из раскадровки и перейдите к инспектору атрибутов, а затем увеличьте количество ячеек прототипа столько, сколько захотите, а затем настройте ячейку tableView в соответствии с вашим требованием. –