Я создаю боковое меню, которое будет выходить слева. Это меню имеет табличное представление, и каждая ячейка при нажатии будет представлять новый ViewController.
Я хочу получить доступ к этому боковому меню со всех контроллеров представления, чтобы оно выглядело одинаково независимо от того, в каком контроллере представления я нахожусь.
Я предполагаю, что это как-то связано с delegate и datasource, но я не могу установить их на self . По крайней мере, я не знаю, где
Мое боковое меню:
import UIKit
private let reuseIdentifier = "SideMenuCell"
class SideMenu: UIViewController, UITableViewDelegate, UITableViewDataSource {
let menuItems = ["One", "Two", "Three", "Four", "Five"]
let blackView = UIView()
let tableview: UITableView = {
let table = UITableView()
table.backgroundColor = .white
table.separatorColor = .clear
return table
}()
let container: UIView = {
let con = UIView()
con.backgroundColor = Colors.main
return con
}()
@objc func showSettings() {
if let window = UIApplication.shared.keyWindow {
let menuWidth = window.frame.width * 0.7
blackView.backgroundColor = UIColor(white: 0, alpha: 0.5)
blackView.addTapGestureRecognizer {
self.handleDismiss()
}
tableview.register(MenuOptionCell.self, forCellReuseIdentifier: reuseIdentifier)
window.addSubview(blackView)
window.addSubview(container)
window.addSubview(tableview)
tableview.anchor(left: container.leftAnchor, bottom: container.bottomAnchor, right: container.rightAnchor, height: window.frame.height * 0.85)
container.frame = CGRect(x: 0, y: 32, width: 0, height: window.frame.height)
blackView.frame = window.frame
blackView.alpha = 0
UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
self.blackView.alpha = 1
self.container.frame = CGRect(x: 0, y: 0, width: menuWidth, height: window.frame.height)
}, completion: nil)
}
}
func handleDismiss() {
if let window = UIApplication.shared.keyWindow {
UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
self.blackView.alpha = 0
self.container.frame = CGRect(x: 0, y: 32, width: 0, height: window.frame.height)
}, completion: nil)
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return menuItems.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! MenuOptionCell
cell.descriptionLabel.text = menuItems[indexPath.row]
// cell.iconImageView.image = image
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 40
}
}
и пользовательская ячейка:
import UIKit
class MenuOptionCell: UITableViewCell {
// Mark: - Properties
let iconImageView: UIImageView = {
let iv = UIImageView()
iv.contentMode = .scaleAspectFit
iv.clipsToBounds = true
return iv
}()
let descriptionLabel: UILabel = {
let label = UILabel()
label.textColor = .black
label.font = UIFont.systemFont(ofSize: 16)
label.text = "Sample Text"
return label
}()
// Mark: - Init
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
backgroundColor = .clear
selectionStyle = .none
addSubview(iconImageView)
addSubview(descriptionLabel)
iconImageView.anchor(top: topAnchor, left: leftAnchor, right: rightAnchor)
descriptionLabel.anchor(top: topAnchor, left: iconImageView.rightAnchor, bottom: bottomAnchor, right: rightAnchor)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
когда я нажимаю левую кнопку навигации, появляется меню, и я вижу табличное представление, но все ячейки пусты.
Я хочу, чтобы ячейки содержали
Идея с контейнером состоит в том, чтобы дать какое-то пространство вверху от таблицы, где я мог бы поместить какую-то другую информацию.





Вам нужно установить self как delegate и dataSource в методе SideMenu контроллера просмотра showSettings
tableview.register(MenuOptionCell.self, forCellReuseIdentifier: reuseIdentifier)
tableview.delegate = self
tableview.datasource = self
@maniponken Кажется, у вас есть метод UIView extension под названием anchor. Покажите этот метод
@maniponken И используйте операторы печати в tableview numberofrows, методы cellforrow и подтвердите, что эти методы вызываются
@maniponken проверить значокImageView, описаниеМетка фрейма в иерархии представлений
Функция anchor слишком длинная. публиковать здесь, но примерно так: func anchor(top: NSLayoutYAxisAnchor? = nil, слева: NSLayoutXAxisAnchor? = nil, снизу: NSLayoutYAxisAnchor? = nil, справа: NSLayoutXAxisAnchor? = nil, paddingTop: CGFloat? = 0, paddingLeft: CGFloat ? = 0, paddingBottom: CGFloat? = 0, paddingRight: CGFloat? = 0, ширина: CGFloat? = nil, высота: CGFloat? = nil) { translatesAutoresizingMaskIntoConstraints = false, если пусть top = top { topAnchor.constraint(equalTo: top, константа: paddingTop!).isActive = true } и так далее...
операторы печати: numberOfRows вызывается 4 раза, cellForRow вызывается 5 раз
Оператор печати @maniponken в ячейке для строки называется? Вы проверили iconImageView, кадр описанияLabel в иерархии представлений
iconImageView и descriptionLabel не отображаются в иерархии представлений
@maniponken в иерархии представлений выберите ячейку. Теперь выберите вид метки или изображения на верхней панели навигации. Теперь проверьте его рамку и ограничения
Хорошо, не уверен, что это то, что вы имеете в виду, но это то, что я нашел (для метки): label.bottom = project.MenuOptionCell.bottom @ 1000 label.height = 19,3333 (размер содержимого) label.width = 30 (размер содержимого) label.left = imageView.right @ метка 1000. right = project.MenuOptionCell.right @ 1000 label.top = project.MenuOptionCell @ 1000
О, я не использую раскадровки, поэтому я этого не понимаю.
вот что я получаю (0.0, 0.0, 0.0, 0.0)
Мне не хватало рамки этикетки и изображения. Теперь я вижу предметы в ячейке. Большое спасибо
Я сделал это и вижу в «иерархии представления отладки», что ячейки есть. Но текстовые метки по-прежнему не отображаются. Может с якорями что-то не так?