didSelectRowAtIndexPath未被调用(Swift)

时间:2014-09-18 04:47:11

标签: ios uitableview swift

我已经进入了一段时间,我在相关帖子中发现的任何内容似乎都无法解决。 我以编程方式将表添加到自定义UIView中。表格和行文本显示正确,但是当我在模拟器上运行并尝试单击任何行时,didSelectRowAtIndexPath和willdSelectRowAtIndexPath都不会触发。

我的代码的相关位如下:

import UIKit
import AVFoundation

@IBDesignable
class PerformanceQuestionView: UIView, UITableViewDelegate, UITableViewDataSource {

var optionsTable = UITableView(frame: CGRectMake(10,200,250,200))

var optionItems = ["One", "Two", "Three", "Four"]

convenience init(rect: CGRect, performanceQuestion:PerformanceQuestion?) {
    self.init(frame: rect)

    NSLog("PerformanceQuestionView.init()")

    self.optionsTable.dataSource = self
    self.optionsTable.delegate   = self
    self.optionsTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
    self.optionsTable.allowsSelection   = true
}

func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
    NSLog("numberOfRowsInSection")
    return optionItems.count
}

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    NSLog("cellForRowAtIndexPath")
    var cell:UITableViewCell = self.optionsTable.dequeueReusableCellWithIdentifier("cell") as UITableViewCell

    cell.textLabel.text = self.optionItems[indexPath.row]

    return cell
}

func tableView(tableView: UITableView!, willSelectRowAtIndexPath indexPath: NSIndexPath!) -> NSIndexPath! {
    NSLog("You will select cell #\(indexPath.row)!")
    return indexPath
}

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    NSLog("You selected cell #\(indexPath.row)!")
}

override func layoutSubviews() {

    super.layoutSubviews()

    self.addSubview(optionsTable)
}

}

7 个答案:

答案 0 :(得分:22)

删除TapGestureRecognizer对我有用!!!

# Returns a queryset
permissions = Permission.objects.all()

# Turns it into a list
permissions = list(permissions)

# Add the results to the many to many field (notice the *)

group = MyGroup.objects.get(name='test')

group.permissions.add(*permissions)

答案 1 :(得分:11)

原因可能是,您在视图中使用平移手势。像AAA提到删除你的平移手势就可以了。但如果您仍想使用平移手势,则可以执行以下操作

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
    view.addGestureRecognizer(tap)
    tap.cancelsTouchesInView = false

制作cancelsTouchesInView,false将启用你所有的点击。

答案 2 :(得分:3)

删除感叹号:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

}

答案 3 :(得分:0)

我长时间遇到同样的问题,我在创建UIView类时以编程方式认为它是UITableView中的一个错误。

我的临时解决方案虽然不是一个好主意,但它确实有效。它是按一个单元大小的按钮放置一个协议调度的动作,以实现至少模拟这个动作。

这不是一个好习惯,但不能长时间呆在那里。

答案 4 :(得分:0)

这在Swift 3中已被弃用:

override func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ 
    ... 
}

并替换为:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    ...
}

答案 5 :(得分:0)

对于Swift 3.0,您需要完全使用此功能:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
 //Input your code here

}

仔细查看以确保您使用此功能。如果您有NSIndexPath,或者在tableView之前没有_但编译器将无效,则编译器不会抱怨。所以使用这个函数,放入一个断点,当你点击一行时你会看到它到达那个点。

我正在使用静态表(所有静态内容单元格)对此进行测试。

答案 6 :(得分:0)

我尝试了这个问题中列出的所有方法和其他方法。我终于从我的故事板中删除了该表并重新开始。

在我的故事板中,我添加了一张原型单元格。我将ViewController连接到表。我将表连接到我的dataSource和委托方法。

我在Attributes Inspector中命名了原型标识符。

这对我有用。我显然没有任何代码可以改变。