ios - TableViewController 没有接收到触摸

标签 ios swift uitableview

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

notouchesapp

之后——工作

@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

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

首先是主视图 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/

相关文章:

ios - Swift:我怎样才能让动画只发生一次而不是每次我编辑东西时都发生

swift - 在实现协议(protocol)的结构上调用方法

swift - 将字符串转换为日期返回 nil

ios - 单击 UISearchBar 时如何用表格 View 替换屏幕上的内容

ios - 自定义 TableViewCells 在静态和动态时显示不同

ios - 带有 UIWebView 的动态 UITableViewCell

ios - 在 ios 的现有应用程序中找不到 .xib 或 Storyboard文件

ios - 用户访问通讯录时的崩溃报告

ios - 无法调用 'saveInBackgroundWithBlock'

swift - 如何在 Swift 中返回单例实例之前等待初始化完成