无法从侧面菜单的页面中获取任何内容
Cannot get anything out of the pages from the side menu
我正在使用 cocoa pods 建立这个 (https://www.youtube.com/watch?v=e8OtfA3YvSM) 很棒的侧边菜单教程。我设法在主页上放置了一些对象(如滚动视图和页面控件),它们完美地显示出来。但是,我似乎无法在链接到侧边菜单的页面 (Cocoa Touch Class) 上完成任何操作。例如,我什至无法在“Link 1”页面上添加一张愚蠢的图片,尽管我遵循了简单明了的步骤:
(1) 我创建了一个故事板视图控制器;
(2) 我将它分配给正确的 class(在我的例子中是 Link1);
(3) 我将 UIImageView 添加到具有所有约束和所有内容的视图控制器。
现在,如果我只是 select 故事板上的图片,当我 运行 应用程序时它不会显示(但出于某种原因,我认为只需添加图片就足够了)。
(4) 我将图片从图片视图中删除;
(5) 我通过@IBOutlet 将图像视图与Link1 视图控制器连接起来。
(6) 然后,在 view did load 我添加这个:
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 行隐式展开可选值时意外发现 nil”。这是我的
imageView.image = UIImage(named: "applespicture")
但是我担心即使我修复了这个问题,Link1-3页仍然没有内容。
顺便说一句,我唯一能做的就是 view.backgroundcolor =)
我查看了您发送给我的项目,发现了问题:
- 在 class
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")
我正在使用 cocoa pods 建立这个 (https://www.youtube.com/watch?v=e8OtfA3YvSM) 很棒的侧边菜单教程。我设法在主页上放置了一些对象(如滚动视图和页面控件),它们完美地显示出来。但是,我似乎无法在链接到侧边菜单的页面 (Cocoa Touch Class) 上完成任何操作。例如,我什至无法在“Link 1”页面上添加一张愚蠢的图片,尽管我遵循了简单明了的步骤: (1) 我创建了一个故事板视图控制器; (2) 我将它分配给正确的 class(在我的例子中是 Link1); (3) 我将 UIImageView 添加到具有所有约束和所有内容的视图控制器。
现在,如果我只是 select 故事板上的图片,当我 运行 应用程序时它不会显示(但出于某种原因,我认为只需添加图片就足够了)。
(4) 我将图片从图片视图中删除; (5) 我通过@IBOutlet 将图像视图与Link1 视图控制器连接起来。 (6) 然后,在 view did load 我添加这个:
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 行隐式展开可选值时意外发现 nil”。这是我的
imageView.image = UIImage(named: "applespicture")
但是我担心即使我修复了这个问题,Link1-3页仍然没有内容。
顺便说一句,我唯一能做的就是 view.backgroundcolor =)
我查看了您发送给我的项目,发现了问题:
- 在 class
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")