如何从一个UIView推出一个UIViewController。

7 浏览
0 Comments

如何从一个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中的单元格时打开相应的视图控制器。请帮忙。

0
0 Comments

问题的出现的原因:用户想要在一个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中进行所需的更改。

0