Как использовать Table View Controller с несколькими подкатегориями - PullRequest
0 голосов
/ 27 июня 2019

У меня есть UITableView, и я хочу добавить несколько категорий.

Мои данные выглядят примерно так:

  • ГлавнаяКатегория А
    • Красная подкатегория
      • Подкатегория X
        • SubSubSubCategory
      • Подкатегория Y
    • Синяя подкатегория
  • ГлавнаяКатегория B
    • Подкатегория Красный
      • Подкатегория X
      • Подкатегория Y
    • голубая подкатегория
      • Подкатегория X
    • Подкатегория Зеленый

На первом экране должны отображаться все основные категории, затем, если я нажму на A, на нем отобразятся красные и синие подкатегории и т. Д. ...

Я искал везде, но не мог найти решение.

Как мне структурировать мои данные, чтобы это работало? cellForRowAt дает только возможность указать данные для первого набора подкатегорий. Где я могу разместить данные для остальных?

Ответы [ 3 ]

1 голос
/ 28 июня 2019

enter image description here

Создание структуры меню с заголовком и массивом объектов меню.

struct Menu {
    var title: String
    var subMenus: [Menu]?
}

Добавить детали меню в контроллере представления, с которого вы хотите запустить меню. И нажмите UITableViewController с помощью объекта меню. При нажатии подменю нажмите UITableViewController с помощью объекта подменю.

// ViewController.swift

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    }
    @IBAction func startMenuAction(_ sender: UIButton) {
        let red1 = Menu(title: "SubCategory Red", subMenus: [Menu(title: "SubSubCategory X", subMenus: [Menu(title: "SubSubSubCategory", subMenus: nil)]),
                                                             Menu(title: "SubSubCategory Y", subMenus: nil)])
        let blue1 = Menu(title: "SubCategory Blue", subMenus: nil)

        let red2 = Menu(title: "SubCategory Red", subMenus: [Menu(title: "SubSubCategory X", subMenus: nil),
                                                             Menu(title: "SubSubCategory Y", subMenus: nil)])
        let blue2 = Menu(title: "SubCategory Blue", subMenus: [Menu(title: "SubSubCategory X", subMenus: nil)])
        let green2 = Menu(title: "SubCategory Green", subMenus: nil)

        let categories = [Menu(title: "MainCategory A", subMenus: [red1, blue1]), Menu(title: "MainCategory B", subMenus: [red2, blue2, green2])]

        let mainMenu:Menu = Menu(title: "My Menu", subMenus: categories)

        let menuVC = MenuVC()
        menuVC.currentMenu = mainMenu
        self.navigationController?.pushViewController(menuVC, animated: true)
    }
}

// MenuVC.swift

class MenuVC: UITableViewController {
    var currentMenu: Menu?
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        title = currentMenu?.title
    }

    // MARK: - Table view data source
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return (currentMenu?.subMenus?.count ?? 0)
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier") ?? UITableViewCell(style: .default, reuseIdentifier: "reuseIdentifier")
        if currentMenu?.subMenus?[indexPath.row].subMenus?.isEmpty ?? true {
            cell.accessoryType = .none
        } else {
            cell.accessoryType = .disclosureIndicator
        }
        cell.textLabel?.text = currentMenu?.subMenus?[indexPath.row].title
        return cell
    }
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if !(currentMenu?.subMenus?[indexPath.row].subMenus?.isEmpty ?? true) {
            let menuVC = MenuVC()
            menuVC.currentMenu = currentMenu?.subMenus?[indexPath.row]
            self.navigationController?.pushViewController(menuVC, animated: true)
        } 
    }
}
1 голос
/ 27 июня 2019

enter image description here

Создайте структуру Menu с заголовком и массивом Menu объектов.

struct Menu {
    var title: String
    var subMenus: [Menu]?
}

Вместо использования табличного представленияUIScrollView и добавление вложенных UIStackView

// ViewController.swift

class ViewController: UIViewController {

    var menus:[Menu] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white

        let red1 = Menu(title: "SubCategory Red", subMenus: [Menu(title: "SubSubCategory X", subMenus: [Menu(title: "SubSubSubCategory", subMenus: nil)]),
                                                             Menu(title: "SubSubCategory Y", subMenus: nil)])
        let blue1 = Menu(title: "SubCategory Blue", subMenus: nil)

        let red2 = Menu(title: "SubCategory Red", subMenus: [Menu(title: "SubSubCategory X", subMenus: nil),
                                                             Menu(title: "SubSubCategory Y", subMenus: nil)])
        let blue2 = Menu(title: "SubCategory Blue", subMenus: [Menu(title: "SubSubCategory X", subMenus: nil)])
        let green2 = Menu(title: "SubCategory Green", subMenus: nil)

        menus = [Menu(title: "MainCategory A", subMenus: [red1, blue1]), Menu(title: "MainCategory B", subMenus: [red2, blue2, green2])]

        let scrollView = UIScrollView()
        scrollView.backgroundColor = .white
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(scrollView)


        let outerStackView = UIStackView()
        outerStackView.axis = .vertical
        outerStackView.alignment = .fill
        outerStackView.distribution = .fillProportionally
        outerStackView.translatesAutoresizingMaskIntoConstraints = false
        scrollView.addSubview(outerStackView)


        scrollView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true            view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[scrollView]|", options: [], metrics: nil, views: ["scrollView": scrollView]))
        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[scrollView]|", options: [], metrics: nil, views: ["scrollView": scrollView]))

        scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[outerStackView]|", options: [], metrics: nil, views: ["outerStackView": outerStackView]))
        scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[outerStackView]|", options: [], metrics: nil, views: ["outerStackView": outerStackView]))
        scrollView.widthAnchor.constraint(equalTo: outerStackView.widthAnchor).isActive = true
        let height = scrollView.heightAnchor.constraint(equalTo: outerStackView.heightAnchor)
        height.priority = .defaultLow
        height.isActive = true
        menus.forEach {
            outerStackView.addArrangedSubview(MenuStackView(menu: $0, padding: 20))
        }
    }

}

// MenuStackView.swift

class MenuStackView: UIStackView {

    convenience init(menu: Menu, padding: CGFloat) {
        self.init()

        axis = .vertical
        alignment = .fill
        distribution = .fillProportionally

        let btn = UIButton(type: .custom)
        btn.contentHorizontalAlignment = .left
        btn.titleEdgeInsets = UIEdgeInsets(top: 0, left: padding, bottom: 0, right: 0)
        btn.addTarget(self, action: #selector(toggle(_:)), for: .touchUpInside)
        btn.setTitleColor(.black, for: .normal)
        btn.setTitle(menu.title, for: .normal)
        btn.translatesAutoresizingMaskIntoConstraints = false
        btn.heightAnchor.constraint(equalToConstant: 40).isActive = true
        addArrangedSubview(btn)

        menu.subMenus?.forEach {
            let stackView = MenuStackView(menu: $0, padding: padding+20)
            stackView.isHidden = true
            self.addArrangedSubview(stackView)
        }
    }
    @objc func toggle(_ sender: UIButton) {
        self.arrangedSubviews.forEach {
            if $0 is MenuStackView {
                $0.isHidden = !$0.isHidden
            }
        }
    }
}
0 голосов
/ 27 июня 2019

Образец проекта можно загрузить с Github .В этом я использую UITableview для отображения другой категории, как вы хотите.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...