Невозможно заполнить ячейки таблицы в боковом меню

Я создаю боковое меню, которое будет выходить слева. Это меню имеет табличное представление, и каждая ячейка при нажатии будет представлять новый 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")
    }

}

когда я нажимаю левую кнопку навигации, появляется меню, и я вижу табличное представление, но все ячейки пусты.

Я хочу, чтобы ячейки содержали

  • Один
  • Два
  • Три
  • Четыре
  • Пять

Идея с контейнером состоит в том, чтобы дать какое-то пространство вверху от таблицы, где я мог бы поместить какую-то другую информацию.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно установить self как delegate и dataSource в методе SideMenu контроллера просмотра showSettings

tableview.register(MenuOptionCell.self, forCellReuseIdentifier: reuseIdentifier)
tableview.delegate = self
tableview.datasource = self

Я сделал это и вижу в «иерархии представления отладки», что ячейки есть. Но текстовые метки по-прежнему не отображаются. Может с якорями что-то не так?

maniponken 15.05.2019 10:15

@maniponken Кажется, у вас есть метод UIView extension под названием anchor. Покажите этот метод

RajeshKumar R 15.05.2019 10:18

@maniponken И используйте операторы печати в tableview numberofrows, методы cellforrow и подтвердите, что эти методы вызываются

RajeshKumar R 15.05.2019 10:20

@maniponken проверить значокImageView, описаниеМетка фрейма в иерархии представлений

RajeshKumar R 15.05.2019 10:21

Функция 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 } и так далее...

maniponken 15.05.2019 10:31

операторы печати: numberOfRows вызывается 4 раза, cellForRow вызывается 5 раз

maniponken 15.05.2019 10:32

Оператор печати @maniponken в ячейке для строки называется? Вы проверили iconImageView, кадр описанияLabel в иерархии представлений

RajeshKumar R 15.05.2019 10:32

iconImageView и descriptionLabel не отображаются в иерархии представлений

maniponken 15.05.2019 10:35

@maniponken в иерархии представлений выберите ячейку. Теперь выберите вид метки или изображения на верхней панели навигации. Теперь проверьте его рамку и ограничения

RajeshKumar R 15.05.2019 11:27

Хорошо, не уверен, что это то, что вы имеете в виду, но это то, что я нашел (для метки): 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

maniponken 15.05.2019 11:34

О, я не использую раскадровки, поэтому я этого не понимаю.

maniponken 15.05.2019 11:44

вот что я получаю (0.0, 0.0, 0.0, 0.0)

maniponken 15.05.2019 11:49

Мне не хватало рамки этикетки и изображения. Теперь я вижу предметы в ячейке. Большое спасибо

maniponken 15.05.2019 12:01

Другие вопросы по теме

Невозможно удалить из очереди ячейку с идентификатором, необходимо зарегистрировать перо или класс для идентификатора или подключить ячейку-прототип в раскадровке
Как я могу анализировать разные изображения в ячейке многократного использования в табличном представлении?
Как первоначально загрузить UITableView, а затем наблюдать за узлом Firebase на предмет изменений для обновления таблицы в Swift?
Индекс вне диапазона пользовательской ячейки TableViewController
Swift 4 - UITableViewController скрывает кнопку удаления editStyleForRowAt .delete
Отправка данных из класса CustomTableView в его родительский контроллер представления
Почему нет контента при использовании Custom UITableViewCell в Swift
Как вручную вызвать ячейку для просмотра таблицы вручную в Swift?
Как перезагрузить видимые ячейки TableView в ios swift
Почему мой json не анализирует все объекты в списке в разные строки с заголовком?