注意:我最初问这个问题,想知道为什么没有调用didSelectRowAtIndex。进一步深入研究,我意识到我的核心问题是我的一个观点没有接收到触摸事件。我将在这里留下这个问题给后人,并问一个更明确的版本。 如果管理员希望根据需要关闭或删除此问题,请继续执行此操作。
我正在我的应用程序中实现一个侧边栏(就像一个汉堡包菜单),我正在使用UITableViewController来完成它。我可以让侧边栏显示并且单元格正确初始化。
我的代码非常简单,我在这里包含所有内容。现在我只有一个主屏幕的视图控制器和侧边栏的表格视图控制器。任何帮助表示赞赏!
更新:看起来问题不在于没有调用didSelectRowAtIndexPath - 这是我的SimpleTableViewController根本没有接到任何触摸!我试过覆盖' touchesBegan:withEvent:'在ViewController和SimpleTableViewController中:ViewController接收触摸就好了,但是表视图控制器似乎什么也得不到。
进一步更新:我意识到这个问题与我在动画中如何显示屏幕右侧的tableview有关。现在我将主应用程序视图“推”到左侧,随之“拉”容器视图。当我这样做时,当我点击它时,没有接触到容器视图。
然而!如果我在主视图上“拉”containerView ,则接收到的触摸就好了。 也许我在这里缺少一些关于iOS认为是触摸合法的屏幕“活跃”部分的基本内容?
代码在这里:
之前 - BROKEN
@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,显示了当触摸不起作用时应用程序的外观。
After-WORKS
@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。我添加了一些代码来更改主视图的背景颜色,以说明正在接收触摸。
代码如下 - 我之前已经完成了我的整个实现,但我已将其编辑为仅包含相关部分。
首先是主视图控制器:
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
})
}
}
对于它的价值,如果你想看到整个应用程序(它只是一个学习应用程序),你可以去这里:https://github.com/bitops/sagacious-quack
答案 0 :(得分:1)
在ViewController的viewDidLoad()中:
//Add these two lines
tableViewController.tableView.dataSource = tableViewController
tableViewController.tableView.delegate = tableViewController
tableViewController.delegate = self
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()
答案 1 :(得分:1)
当您将另一个视图控制器的视图添加到视图层次结构时,您必须让父级和子级都知道,因此父级可以将相关消息转发给子级。 Apple的View Controller Programming Guide,“实现自定义容器视图控制器”部分对此进行了解释。
在你的情况下,你需要这样的东西:
[self addChildViewController:tableViewController];
containerView.addSubview(tableViewController.tableView)
[tableViewController didMoveToParentViewController:self];