Я хочу построить пользовательский интерфейс с динамической сеткой. По крайней мере, я думаю, что сетка - это путь. Элементы управления каждой ячейки должны быть одинаковыми, например: TextBox
a Checkbox
a radiobutton
.
У меня есть несколько таблиц на странице. Таблица заполняется в соответствии с данными из базы данных. В каждой строке может быть разное количество ячеек, и я подумал об использовании динамически создаваемого столбца. Я не мог установить точную логику этого. Ниже я настрою, как это сделать. Можете ли вы объяснить простую логику с помощью примера кода?
Если есть неясное место, вы можете спросить?
Спасибо.
func createTableView(id: Int)-> UIView
{
let tableAreaView = UIView()
tableAreaView.backgroundColor = UIColor.blue
// tableAreaView.isHidden = true
let customTableView = UITableView()
customTableView.separatorStyle = .none
tableAreaView.addSubview(customTableView)
let celll:tablecell = tablecell()
celll.setColumnElement(gridID: 1, listype: "Checkbox")
customTableView.register(celll.self, forCellReuseIdentifier: "cell")
customTableView.dataSource = self
customTableView.delegate = self
return tableAreaView
}
func numberOfSections(in t: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 50
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerDynamicallyTable = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.frame.width, height: 50))
headerDynamicallyTable.backgroundColor = Utility.getColor(red: 233, green: 235, blue: 237)
for i in 0...self.listColumnArray.count {
let title = UILabel()
headerDynamicallyTable.addSubview(title)
title.translatesAutoresizingMaskIntoConstraints = false
//self.titleTextArea.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
title.leftAnchor.constraint(equalTo: headerDynamicallyTable.leftAnchor, constant: CGFloat(30 * i)).isActive = true
title.topAnchor.constraint(equalTo: headerDynamicallyTable.topAnchor, constant: 20).isActive = true
//name.rightAnchor.constraint(equalTo: createDateText.leftAnchor).isActive = true
//self.titleTextArea.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
title.font = UIFont(name: Utility.getFont(2), size: 22)
}
return headerDynamicallyTable
}
func tableView(_ t: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.listRowArray.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 50
}
func tableView(_ t: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath as IndexPath) as! tablecell
let item = self.listRows.object(at: indexPath.row) as! tablecell
return cell
}
клетка
var navigationController: UINavigationController?
var listColumn:[listElement] = []
var listType :String
var containerArea: UIView!
public func setColumnElement(gridID:Int,listype:String) {
self.listColumn= listDataSource.getColumnsBygridID(gridID: gridID)!
self.listType = listype
}
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.containerArea = UIView()
contentView.addSubview(self.containerArea)
self.containerArea.backgroundColor = color.ThemaColor(color: .Red)
self.containerArea.translatesAutoresizingMaskIntoConstraints = false
self.containerArea.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: 10).isActive = true
self.containerArea.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 15).isActive = true
self.containerArea.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: 5).isActive = true
//container.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 20).isActive = true
self.containerArea.heightAnchor.constraint(equalToConstant: 400).isActive = true
//self.containerArea.widthAnchor.constraint(equalTo: contentView.widthAnchor).isActive = true
self.containerArea.widthAnchor.constraint(equalTo: contentView.widthAnchor).isActive = true
self.containerArea.layer.borderWidth = 1
self.containerArea.layer.masksToBounds = false
self.containerArea.layer.borderColor = Utility.getThemeColor(color: .Seperator).cgColor
self.containerArea.clipsToBounds = true
for i in 0...self.checklistColumnElement.count{
if( self.listType == "Textbox")
{
let text = UITextField()
containerArea.addSubview( text)
text.translatesAutoresizingMaskIntoConstraints = false
text.leftAnchor.constraint(equalTo: self.containerArea.leftAnchor, constant: CGFloat(30 * i)).isActive = true
text.topAnchor.constraint(equalTo: self.containerArea.topAnchor, constant: 20).isActive = true
text.font = UIFont(name: Utility.getFont(2), size: 22)
}
if( self.listType == "Checkbox")
{
let checkbox = UIButton()
containerArea.addSubview(checkbox)
checkbox.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
checkbox.widthAnchor.constraint(equalToConstant: 30).isActive = true
checkbox.leadingAnchor.constraint(equalTo: containerArea.trailingAnchor, constant: 160).isActive = true
checkbox.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
checkbox.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
checkbox.heightAnchor.constraint(equalTo: self.heightAnchor).isActive = true
checkbox.setImage(UIImage(named: "checked.png"), for: UIControlState.selected)
checkbox.setImage(UIImage(named: "emptyCheck.png"), for: UIControlState.normal)
checkbox.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
}
if( self.listType == "Radiobutton")
{
}
}
let seperator = UIView()
contentView.addSubview(seperator)
seperator.translatesAutoresizingMaskIntoConstraints = false
seperator.heightAnchor.constraint(equalToConstant: 1).isActive = true
seperator.rightAnchor.constraint(equalTo: contentView.rightAnchor).isActive = true
seperator.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
seperator.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
}
@objc private func buttonClicked(sender: UIButton) {
}
Лучше ли использовать представление с прокруткой и просмотр стека вместо представления таблицы?
Потому что мне тоже нужно получить ответы
Как сделать это быстрее всего?