Ничего не вытащить со страниц из бокового меню - PullRequest
0 голосов
/ 05 августа 2020

Я основываюсь на этом (https://www.youtube.com/watch?v=e8OtfA3YvSM) потрясающем руководстве по боковым меню с какао-стручками. Мне удалось разместить некоторые объекты на домашней странице (например, прокрутку и элемент управления страницей), и они отлично отображаются. Однако я не могу ничего сделать правильно на страницах (Класс Cocoa Touch), которые связаны с боковым меню. Например, я не могу даже добавить тупую картинку на страницу «Ссылка 1», хотя я выполняю простые и понятные процедуры: (1) я создаю контроллер представления раскадровки; (2) я присваиваю его правильному классу (в моем примере это Link1); (3) Я добавляю UIImageView к контроллеру представления со всеми ограничениями и всем остальным.

Теперь, если я просто выберу изображение на раскадровке, оно не будет отображаться при запуске приложения (но по какой-то причине Я думал, что достаточно просто добавить картинку).

(4) Я удаляю изображение из просмотра; (5) Я подключаю представление изображения к контроллеру представления Link1 через @IBOutlet. (6) Затем, в зависимости от загрузки, я добавляю это:

imageView.image = UIImage(named: "applespicture")

, и он вылетает ... и я сижу там как идиот.

Я знаю, что это, наверное, глупый вопрос и это легко исправить, но я далеко в начале этого бесконечного пути. Не могли бы вы сказать мне, что я делаю не так? И, что более важно, как мне go насчет быстрых файлов Link1, Link2 и Link3. Есть ли особый c способ, как я должен там кодировать или добавлять что-либо, потому что на этих страницах ничего не отображается, что бы я ни делал. А в моем проекте их около 15, так что мне нужно получить его сейчас.

Вот код моего бокового меню, которое находится на домашней странице:

import UIKit
import SideMenu



class HomeViewController: UIViewController, MenuControllerDelegate {
private var sideMenu: SideMenuNavigationController?
private let link1Controller = Link1()
private let link2Controller = Link2()
private let link3Controller = Link3()



override func viewDidLoad() {
    super.viewDidLoad()
    let menu = MenuController(with: SideMenuItem.allCases)
    menu.delegate = self
    sideMenu = SideMenuNavigationController(rootViewController: menu)
    sideMenu?.leftSide = true
    SideMenuManager.default.leftMenuNavigationController = sideMenu
    SideMenuManager.default.addPanGestureToPresent(toView:  view)
    addChildControllers()
}


private func addChildControllers() {
    addChild(link1Controller)
    addChild(link2Controller)
    addChild(link3Controller)
    
    view.addSubview(link1Controller.view)
    view.addSubview(link2Controller.view)
    view.addSubview(link3Controller.view)
    
    link1Controller.view.frame = view.bounds
    link2Controller.view.frame = view.bounds
    link3Controller.view.frame = view.bounds
    
    link1Controller.didMove(toParent: self)
    link2Controller.didMove(toParent: self)
    link3Controller.didMove(toParent: self)
    
    link1Controller.view.isHidden = true
    link2Controller.view.isHidden = true
    link3Controller.view.isHidden = true
}



@IBAction func didTap( sender: Any) {
    present(sideMenu!, animated: true)
}



func didSelectMenuItem(named: SideMenuItem) {
    sideMenu?.dismiss(animated: true, completion: nil)
    title = named.rawValue
    switch named {
    case .home:
        link1Controller.view.isHidden = true
        link2Controller.view.isHidden = true
        link3Controller.view.isHidden = true
    case .link1:
        link1Controller.view.isHidden = false
        link2Controller.view.isHidden = true
        link3Controller.view.isHidden = true
    case .link2:
        link1Controller.view.isHidden = true
        link2Controller.view.isHidden = false
        link3Controller.view.isHidden = true
    case .link3:
        link1Controller.view.isHidden = true
        link2Controller.view.isHidden = true
        link3Controller.view.isHidden = false } }
}



protocol MenuControllerDelegate {
func didSelectMenuItem(named: SideMenuItem) }



enum SideMenuItem: String, CaseIterable {
case home = "Home"
case link1 = "Link 1"
case link2 = "Link 2"
case link3 = "Link 3" }



class MenuController: UITableViewController {



public var delegate: MenuControllerDelegate?
private let menuItems: [SideMenuItem]
private let tiffanyColor = UIColor(
    red: 129/255,
    green: 216/255,
    blue: 208/255,
    alpha: 1)



init(with menuItems: [SideMenuItem]) {
    self.menuItems = menuItems
    super.init(nibName: nil, bundle: nil)
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") }



required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented") }



override func viewDidLoad() {
    super.viewDidLoad()
    tableView.backgroundColor = tiffanyColor }



override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    navigationController?.isNavigationBarHidden = true
    return menuItems.count }



override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = menuItems[indexPath.row].rawValue
    cell.textLabel?.textColor = .white
    cell.backgroundColor = tiffanyColor
    return cell }



override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
    let selectedItem = menuItems[indexPath.row]
    delegate?.didSelectMenuItem(named: selectedItem) }
}

А также то, что у меня есть для страницы Link1:

import UIKit

class Link1: UIViewController {

@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    imageView.image = UIImage(named: "applespicture")
    
    }
}

О, и когда он вылетает, он говорит: «Неустранимая ошибка: неожиданно обнаружен nil при неявном развертывании необязательного значения в строке 18». Вот где у меня

imageView.image = UIImage(named: "applespicture")

Но я боюсь, что даже если я исправлю эту проблему, страницы Link1-3 все равно не будут отображать контент.

Кстати, единственное, что я могу сделать есть view.backgroundcolor =)

1 Ответ

0 голосов
/ 05 августа 2020

Я просмотрел проект, который вы мне прислали, обнаружил проблемы:

  • в классе Link1 вы создали 2 выхода для одного UIImageView, один из этих выходов стал недействительным, и это заставило приложение трещать sh, поэтому я оставил только popary розетку
popary.image = UIImage(named: "applespicture")
  • вы неправильно создали экземпляры контроллеров Link * view, так как по крайней мере Link1 должен быть создан из раскадровки, чтобы стать действительным магазины. Мы можем установить Storyboard ID (link1ViewController) и сделать следующее:
private let link1Controller = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(identifier: "link1ViewController")
...