我有以下视图控制器设置:
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)
}