从侧面菜单中无法从页面中获取任何内容

Posted

技术标签:

【中文标题】从侧面菜单中无法从页面中获取任何内容【英文标题】:Cannot get anything out of the pages from the side menu 【发布时间】:2020-08-04 22:54:49 【问题描述】:

我正在建立这个 (https://www.youtube.com/watch?v=e8OtfA3YvSM) 很棒的可可豆侧面菜单教程。我设法在主页上扔了一些对象(如滚动视图和页面控件),它们完美地显示出来。但是,我似乎无法在链接到侧边菜单的页面(Cocoa Touch 类)上正确完成任何操作。例如,我什至不能在“链接 1”页面上添加一个愚蠢的图片,即使我遵循简单明了的程序: (1)我创建了一个故事板视图控制器; (2) 我将它分配给正确的类(在我的示例中是 Link1); (3) 我将 UIImageView 添加到具有所有约束和所有内容的视图控制器中。

现在,如果我只是在情节提要上选择一张图片,当我运行应用程序时它不会显示(但出于某种原因,我认为只需添加一张图片就足够了)。

(4) 我将图像从图像视图中删除; (5) 我通过@IBOutlet 将图像视图与Link1 视图控制器连接起来。 (6) 然后,在视图中确实加载了我添加了这个:

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

然后它崩溃了……我像个白痴一样坐在那里。

我知道这可能是一个愚蠢的问题并且很容易解决,但我还处于这个无尽旅程的开始阶段。那么你能告诉我我做错了什么吗?而且,更重要的是,我应该如何处理 swift 文件 Link1、Link2 和 Link3。有没有一种特定的方式我应该在那里编码或添加任何东西,因为无论我做什么,这些页面上似乎都没有显示任何内容。在我的项目中,我有 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")
    
    

哦,当它崩溃时,它会显示“致命错误:在第 18 行隐式展开 Optional 值时意外发现 nil”。这是我有的地方

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

但恐怕即使我解决了这个问题,Link1-3 页面仍然会显示任何内容。

顺便说一句,我唯一能做的就是 view.backgroundcolor =)

【问题讨论】:

阿斯佩里,你在哪里? 【参考方案1】:

我查看了您发送给我的项目,发现了问题:

Link1 类中,您为单个UIImageView 创建了2 个插座,其中一个插座无效,这导致应用程序崩溃,所以我只留下popary 插座
popary.image = UIImage(named: "applespicture")
您以错误的方式实例化了您的 Link* 视图控制器,因为至少应该从情节提要中实例化 Link1 以获得有效的出口。我们可以设置一个Storyboard ID (link1ViewController) 并执行如下操作
private let link1Controller = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(identifier: "link1ViewController")

【讨论】:

以上是关于从侧面菜单中无法从页面中获取任何内容的主要内容,如果未能解决你的问题,请参考以下文章

在 Ionic 2 中禁用侧面菜单滑动以打开登录页面(或任何页面)的手势

无法在 app.component Ionic / Angular 中获取数据

React在哪里放置一个带有侧边菜单的单页应用程序的登录页面

如何从页面中删除 iframe 的填充

如何在反应原生导航 Wix V2 中从侧边菜单导航到页面

Asp.net 使用 ajax (javascript) 从布局页面中的 api 控制器获取数据