2017-02-20 8 views
-1

Я пытаюсь создать UITableView, который может поддерживать различные объекты/элементы внутри него. В частности, эти элементы являются UITextField и UISwitch.Прототип UITableViewCell с другими объектами (UITextField, UISwitch)

Первая проблема:

элементы не отображаются. Они помещаются в прототип cell, который затем строится внутри class, который я установил. Я подтвердил, что настройка cell работает, потому что я могу менять слова на каждом cell, но нет никаких элементов в пределах cell.

Вот код, который строит свои клетки прямо сейчас:

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



public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "EmailCell") 
    return cell 
} 

Вторая проблема (которая может быть решена вместе с первым):

У меня нет никакого способа доступа к информации в каждый UITextField или каждый UISwitch. Как я могу получить эту информацию из всех существующих ячеек?

Заранее благодарим за помощь!

+0

Является ли стиль ячейки прототипа установлен в 'Таможня'? – vadian

+0

Вы должны показать код, который вы используете, для «создания ячеек внутри класса». Кроме того, может оказаться полезным скриншот вашей раскадровки. – naglerrr

+0

Кажется, вы пытаетесь создать форму. Вы можете опробовать https://github.com/xmartlabs/Eureka – Sweeper

ответ

1

В коде есть несколько ошибок.

Для пользовательских ячеек вам необходимо реализовать пользовательский подкласс UITableViewCell. Вот пример:

import UIKit  

class EmailCell: UITableViewCell { 

    @IBOutlet var customTextField: UITextField! 
    @IBOutlet var customSwitch: UISwitch! 

} 

После этого откройте свою раскадровку и выберите ячейку прототипа. Измените его класс на EmailCell в Identity Inspector.

enter image description here

Также убедитесь, что для подключения элементов пользовательского интерфейса к @IBOutlet с ранее созданным. См. this StackOverflow post, если вам нужна помощь с @IBOutlet.

enter image description here

На следующем этапе, изменить tableView(_:, cellForRowAt:) реализации, как это:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 
    let cell = tableView.dequeueReusableCell(withIdentifier: "EmailCell", for: indexPath) as! EmailCell 

    // Configure your custom ui elements however you want 
    cell.customTextField.text = "somestring" 
    cell.customSwitch.isOn = true 

    return cell 
} 
+0

Это работает фантастически! Огромное спасибо. Одна вещь, знаете ли вы, как я обнаружил бы изменение в текстовом поле или в моем классе _view controller_? (Это класс, который содержит настройку tableView) – TheMooCows237

0

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

tableView.dequeueReusableCell(withIdentifier: -Your cell Id- , for: indexPath) as? -Your Cell Class- 

в камере для строки по индексу метода источника данных

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

cell.-your switch/text field-.addTarget(self, action: #selector(valueChanged(_:)), for: .valueChanged) 

и вы должны создать подкласс UITableView ячейки, чтобы добавить недвижимость/iboutlets

class YourTableViewCell: UITableViewCell { 

    @IBOutlet weak var yourSwitch: UISwitch! 

} 
+0

Хорошо, я добавил dequeueReusableCell внутри метода cellForRowAt. Однако я не могу вызвать ячейку [switch/text field], потому что она не распознает, что внутри ячейки прототипа есть текстовое поле. Я также не могу связать текстовое поле как выход, потому что XCode дает мне ошибку, говоря, что я не могу связать выходы с повторением содержимого. – TheMooCows237

Смежные вопросы