如何将触摸事件从页面视图控制器传递到容器控制器



我有以下视图控制器设置:

override func viewDidLoad() {
super.viewDidLoad()

let pageViewController = UIPageViewController(
transitionStyle: .scroll, navigationOrientation: .horizontal, options: Constants.pageViewControllerOptions
)

pageViewController.view.frame = view.bounds

view.addSubview(pageViewController.view)
addChild(pageViewController)
pageViewController.didMove(toParent: self)

let vc = TableViewController()
pageViewController.setViewControllers([vc], direction: .forward, animated: false, completion: nil)

}

TableViewController:

class TableViewController: UIViewController {

private enum Constants {
static let headerHeight: CGFloat = 210
}

let tableView = TouchTable()

var scrollBlock: ((UIScrollView) -> Void)?
override func viewDidLoad() {
super.viewDidLoad()

tableView.backgroundColor = .clear

tableView.dataSource = self
tableView.delegate = self

tableView.contentInset = UIEdgeInsets(top: Constants.headerHeight, left: 0.0, bottom: 0.0, right: 0.0)
tableView.contentOffset = CGPoint(x: 0.0, y: -Constants.headerHeight)
}

override func loadView() {
let view = UIView()
view.addSubview(tableView)
tableView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
tableView.topAnchor.constraint(equalTo: view.topAnchor),
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])

self.view = view
}

}

TouchTable是这样的:

class TouchTable: UITableView {
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return false
}
}

我已经尝试过这个代码,但它没有将触摸传递给下面的视图控制器。我怎样才能做到这一点?

class TouchTable: UITableView {
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return false
}
}

我认为这段代码阻止了UIEvent从表视图中实例化,所以这并不是说事件未能传递,而是因为事件未能从表视图实例化。

您可以使用协议/委派模式,但也可以使用UIResponder链。

让您的父视图控制器采用并遵守协议:

@objc protocol EventFromChildVC: AnyObject {
func didSelect(_ sender: ChildVC)
}
func didSelect(_ sender: ChildVC) {
// passed event
}

并从子视图控制器发送动作:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
UIApplication.shared.sendAction(#selector(EventFromChildVC.didSelect(_:)), to: nil, from: self, for: nil)
}

最新更新