注意:我最初问这个问题是想知道为什么没有调用 didSelectRowAtIndex。进一步深入研究,我意识到我的核心问题实际上是我的一个 View 没有接收到触摸事件。我将把这个问题留给后代,并提出一个更明确的版本。 如果管理员想酌情关闭或删除此问题,请继续这样做。
我正在我的应用程序中实现侧边栏(如汉堡菜单),并且我正在使用 UITableViewController 来实现它。我可以让侧边栏显示出来,并且单元格正在正确初始化。
我的代码非常简单,我将所有代码都包含在这里。现在我只有一个用于主屏幕的 View Controller 和一个用于侧边栏的表格 View Controller 。感谢您的帮助!
更新:看起来问题不在于 didSelectRowAtIndexPath 没有被调用——而是我的 SimpleTableViewController 根本没有接收到任何触摸! 我尝试覆盖 ' touchesBegan:withEvent:' 在 ViewController 和 SimpleTableViewController 中:ViewController 接收触摸很好,但 TableView Controller 似乎没有接收到任何东西。
进一步更新:我意识到问题与我如何制作动画以显示屏幕右侧的表格 View 有关。现在,我正在将主应用程序 View “推”到左侧,从而“拉动”containerView。当我这样做时,当我点击 containerView 时,不会有任何触摸。
但是!如果我将 containerView“拉”到 主视图之上,则可以很好地接收到触摸。 也许我在这里遗漏了一些关于 iOS 认为触摸是合法的屏幕“事件”部分的基本知识?
代码在这里:
之前——损坏
@IBAction func push() {
// containerView is "pulled" alongside self.view
UIView.animateWithDuration(3.0) {
self.view.frame = CGRectMake(self.originalX - 250, self.originalY, self.view.frame.width, self.view.frame.height)
}
}
这是一个 gif 动图,显示了当触摸不起作用时应用程序的外观。
之后——工作
@IBAction func push() {
// containerView is "pulled" on top of self.view
UIView.animateWithDuration(3.0) {
self.containerView.frame = CGRectMake(self.originalX - 250, self.originalY, 250, self.frameHeight)
}
}
这是一个 gif 动图,显示了当触摸起作用时应用程序的外观。我添加了一些代码来更改主视图的背景颜色,以说明正在接收触摸。
代码如下 - 我之前在此处完成了整个实现,但我已将其编辑为仅包含相关部分。
首先是主视图 Controller :
import UIKit
class ViewController: UIViewController, SimpleTableViewControllerDelegate {
var x = UIView()
var y = UIView()
var containerView = UIView()
let animationDuration = 1.5;
let delayTime = 0.25;
let animationTime = 0.25;
var tableViewController = SimpleTableViewController()
override func viewDidLoad() {
super.viewDidLoad()
originalX = self.view.frame.origin.x
originalY = self.view.frame.origin.y
frameHeight = self.view.frame.height
frameWidth = self.view.frame.width
containerView.frame = CGRectMake(frameWidth, originalY, 250, frameHeight)
containerView.backgroundColor = UIColor.magentaColor()
containerView.clipsToBounds = false
view.addSubview(containerView)
tableViewController.items = ["Lemon", "Lime", "Agave"]
tableViewController.delegate = self
tableViewController.tableView.dataSource = tableViewController
tableViewController.tableView.delegate = tableViewController
tableViewController.tableView.frame = containerView.bounds
tableViewController.tableView.backgroundColor = UIColor.lightGrayColor()
tableViewController.tableView.scrollsToTop = false
tableViewController.tableView.separatorStyle = .None
tableViewController.tableView.contentInset = UIEdgeInsets(top: 64.0, left: 0, bottom: 0, right: 0)
tableViewController.tableView.reloadData()
addChildViewController(tableViewController)
containerView.addSubview(tableViewController.tableView)
tableViewController.didMoveToParentViewController(self)
}
func didSelectRowAtIndexPath(indexPath: NSIndexPath) {
NSLog("[ViewController] invoked didSelectRowAtIndexPath with \(indexPath.row)")
}
var originalX : CGFloat!
var originalY : CGFloat!
var frameHeight : CGFloat!
var frameWidth : CGFloat!
@IBAction func push() {
UIView.animateWithDuration(animationTime, delay: 0, options: .CurveLinear, animations: {
self.view.frame = CGRectMake(self.originalX - 250, self.originalY, self.view.frame.width, self.view.frame.height)
}, completion: { (var b) -> Void in
})
}
@IBAction func pull() {
UIView.animateWithDuration(animationTime, delay: 0, options: .CurveLinear, animations: {
self.view.frame = CGRectMake(self.originalX, self.originalY, self.view.frame.width, self.view.frame.height)
}, completion: { (var b) -> Void in
})
}
}
就其值(value)而言,如果您想查看整个应用程序(它只是一个学习应用程序),您可以访问此处:https://github.com/bitops/sagacious-quack
最佳答案
当您将另一个 View Controller 的 View 添加到您的 View 层次结构时,您必须让父级和子级都知道,以便父级可以将相关消息转发给子级。这在 Apple 的 View Controller Programming Guide 中有解释。 ,在“实现自定义容器 View Controller ”部分。
在你的情况下,你需要这样的东西:
[self addChildViewController:tableViewController];
containerView.addSubview(tableViewController.tableView)
[tableViewController didMoveToParentViewController:self];
关于ios - TableViewController 没有接收到触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31979780/