如何从一个UIView推出一个UIViewController。
如何从一个UIView推出一个UIViewController。
我刚开始学习iOS开发,正在制作一个类似许多应用程序的左侧菜单栏。我已经达到了一个点,但现在卡住了。请帮忙。
我有一个名为LeftMenu的类,声明如下:
class LeftMenu: UIView, UITableViewDelegate, UITableViewDataSource {
原因是我在多个UIViewControllers中使用相同的LeftMenu
有一个tableView代表scrollMenu,我正在观察选中的行,如下:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
switch self.menuItems[indexPath.row] {
case "Wever":
print(self.menuItems[indexPath.row])
case "Payments":
print(self.menuItems[indexPath.row])
case "Profile":
print(self.menuItems[indexPath.row])
case "Trip History":
print(self.menuItems[indexPath.row])
case "Referral":
print(self.menuItems[indexPath.row])
case "Help":
print(self.menuItems[indexPath.row])
case "Settings":
print(self.menuItems[indexPath.row])
case "About":
print(self.menuItems[indexPath.row])
default:
break
}
}
我在每个视图控制器中使用LeftMenu来弹出菜单。
我想要做的是在选中tableView中的单元格时打开相应的视图控制器。请帮忙。
问题的出现的原因:用户想要在一个UIView中实现推送一个UIViewController的功能,但是在点击cell时,无法将view controller推送出来。
解决方法:可以通过创建一个delegate协议来实现。在LeftMenu.swift中创建一个LeftMenuDelegate协议,让展示LeftMenu的view controller实现该协议,从而负责推送新的view controller。然后在所有展示LeftMenu的view controller中实现LeftMenuDelegate协议方法,将view controller推送到导航栏中。
具体代码如下:
在LeftMenu.swift中:
protocol LeftMenuDelegate: class {
func leftMenuDidSelectViewController(_ viewController: UIViewController)
}
class LeftMenu: UIView, UITableViewDelegate, UITableViewDataSource {
public weak var delegate: LeftMenuDelegate?
...
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
switch self.menuItems[indexPath.row] {
case "Wever":
let viewController = WeverViewController()
self.delegate?.leftMenuDidSelectViewController(viewController)
...
}
}
...
}
在展示LeftMenu的view controller中:
class SomeViewController: UIViewController, LeftMenuDelegate {
...
let leftMenu = LeftMenu()
leftMenu.delegate = self
...
func leftMenuDidSelectViewController(_ viewController: UIViewController) {
self.navigationController?.pushViewController(viewController, animated: true)
}
}
可以为所有包含LeftMenu的view controller创建一个基类,以便不必多次实现相同的代码。
还可以选择不推送一个新的view controller,而是直接在当前view controller中进行所需的更改。可以通过让LeftMenu调用像setupWeverView()这样的方法来实现,根据需要进行相应的更改。
有用户反馈在点击cell时,无法将view controller推送出来。此时可以检查代码是否正确实现了delegate协议的方法。
另外,如果用户不想要顶部的导航栏,可以选择不进行推送操作,而是直接在当前view controller中进行所需的更改。