如何访问容器中各部分的行?
How can I access the rows in sections in my container?
我以编程方式创建了一个包含两个部分(4 + 2 行)的侧边菜单。
我的主控制器是 UIViewController
。为了在我的视图控制器中创建一个包含不同部分的分组 table 视图,我必须在其中放置一个容器视图,并使用 table 视图嵌入到我的另一个 VC 中。
为了访问我在不同部分的行,我首先创建了一个枚举:
enum MenuType: Int, CaseIterable {
case a, b, c, d
case e, f
var section: Int {
switch self {
case .a, .b, .c, .d : return 0
case .e, .f: return 1
}
}
var row: Int? {
switch self.section {
case 0: return self.rawValue
case 1: return self.rawValue - MenuType.allCases.filter{ [=10=].section < self.section }.count
default: return nil
}
}
}
在我的 MainVC
中调用 MenuTypes
var didTapMenuType: ((MenuType) -> Void)?
为了 select 正确的部分,我尝试了以下操作:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let menuType = MenuType.allCases.first(where: { [=12=].section == indexPath.section && [=12=].row == indexPath.row }) else {return}
dismiss(animated: true) { [weak self] in
self?.didTapMenuType?(menuType)
}
}
在我的 MainVC 中,我做了一个 Switch-Case 来对不同的情况应用操作:
func transition(_ menuType: MenuType)
switch menuType {
case .a:
// action
case .b:
...
最后在用户点击侧边菜单按钮时调用它:
//button action ...
menuViewController.didTapMenuType = { menuType in
self.transitionToNew(menuType)
过渡效果很好。但是当 select 连续出现时,什么也没有发生。
当我的主控制器是 UITableViewController 时它起作用了。我唯一改变的是将我的 table 视图嵌入到我的 UIViewController 的容器中以获得对布局的更多控制(将视图布局在 [= =49=] 视图控制器).
谁能告诉我我错过了什么?我想问题是我的 tableView(disSelectRowAt:) 函数不适用于容器内的 table 视图!?
抱歉这个问题太长了,但我想不出可行的解决方案。
提前致谢!
看起来您还没有在 Interface Builder 或代码中将您的 tableView
委托连接到您的 viewController
,例如 viewDidLoad
:
myTableView.delegate = self
编辑:不要忘记让你的视图控制器符合UITableViewDelegate
class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { ... }
我以编程方式创建了一个包含两个部分(4 + 2 行)的侧边菜单。
我的主控制器是 UIViewController
。为了在我的视图控制器中创建一个包含不同部分的分组 table 视图,我必须在其中放置一个容器视图,并使用 table 视图嵌入到我的另一个 VC 中。
为了访问我在不同部分的行,我首先创建了一个枚举:
enum MenuType: Int, CaseIterable {
case a, b, c, d
case e, f
var section: Int {
switch self {
case .a, .b, .c, .d : return 0
case .e, .f: return 1
}
}
var row: Int? {
switch self.section {
case 0: return self.rawValue
case 1: return self.rawValue - MenuType.allCases.filter{ [=10=].section < self.section }.count
default: return nil
}
}
}
在我的 MainVC
中调用 MenuTypesvar didTapMenuType: ((MenuType) -> Void)?
为了 select 正确的部分,我尝试了以下操作:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let menuType = MenuType.allCases.first(where: { [=12=].section == indexPath.section && [=12=].row == indexPath.row }) else {return}
dismiss(animated: true) { [weak self] in
self?.didTapMenuType?(menuType)
}
}
在我的 MainVC 中,我做了一个 Switch-Case 来对不同的情况应用操作:
func transition(_ menuType: MenuType)
switch menuType {
case .a:
// action
case .b:
...
最后在用户点击侧边菜单按钮时调用它:
//button action ...
menuViewController.didTapMenuType = { menuType in
self.transitionToNew(menuType)
过渡效果很好。但是当 select 连续出现时,什么也没有发生。 当我的主控制器是 UITableViewController 时它起作用了。我唯一改变的是将我的 table 视图嵌入到我的 UIViewController 的容器中以获得对布局的更多控制(将视图布局在 [= =49=] 视图控制器).
谁能告诉我我错过了什么?我想问题是我的 tableView(disSelectRowAt:) 函数不适用于容器内的 table 视图!?
抱歉这个问题太长了,但我想不出可行的解决方案。 提前致谢!
看起来您还没有在 Interface Builder 或代码中将您的 tableView
委托连接到您的 viewController
,例如 viewDidLoad
:
myTableView.delegate = self
编辑:不要忘记让你的视图控制器符合UITableViewDelegate
class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { ... }