TableViewController没有接收到触摸

时间:2015-08-13 04:57:13

标签: ios swift uitableview

注意:我最初问这个问题,想知道为什么没有调用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,显示了当触摸不起作用时应用程序的外观。

notouchesapp

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。我添加了一些代码来更改主视图的背景颜色,以说明正在接收触摸。

enter image description here

代码如下 - 我之前已经完成了我的整个实现,但我已将其编辑为仅包含相关部分。

首先是主视图控制器:

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

2 个答案:

答案 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];