Swift UITableView didSelectRowAtIndexPath没有被调用

时间:2015-03-15 19:32:40

标签: ios swift

IOS开发新手,在处理表格上的单元格选择时遇到问题。每当我选择时,该方法都不会在下面调用 - 任何想法为什么?

我的项目结构是: 视图控制器 - >查看 - >表格视图

以下代码演示了方法调用。其他人被称为没有问题!我知道触摸工作正在下拉成功刷新,点击一个单元格确实会突出显示。

import UIKit

class ViewController: UIViewController, UITableViewDelegate
{

   let blah = ["blah1"]

   //How many sections are in the table?
   func numberOfSectionsInTableView(tableView: UITableView) -> Int {
      return 1
   }

   //How many rows? (returns and int)
   func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      return blah.count
   }

  //table contents for each cell?
  //Each time this is called it'll return the next row and thus build a table...
  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
      print("Populating each cell of table view!\n")
      tableView.rowHeight = 80.0
      var cell = UITableViewCell()

      var(a) = blah[indexPath.row]
      var image : UIImage = UIImage(named: a)!
      cell.imageView.image = image

      return cell
  }



  //Code Cell Selected
  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
      println("You selected cell #\(indexPath.row)!")

  }


  func tableView(tableView: UITableViewDelegate, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
     print("wananananaanan" )
     println("You deselected cell #\(indexPath.row)!")

  }




  override func viewDidLoad() {
     super.viewDidLoad()

     // Do any additional setup after loading the view, typically from a nib.

  }

  override func didReceiveMemoryWarning() {
     super.didReceiveMemoryWarning()
     // Dispose of any resources that can be recreated.
  }
}

11 个答案:

答案 0 :(得分:37)

您必须将[{1}}设置为@IBOutlet tableView并设置为ViewControllerdelegate,您可以看到数据响应dataSource的变化。

这样的事情:

tableView

并实现override func viewDidLoad() { super.viewDidLoad() self.tableView.delegate = self self.tableView.dataSource = self } 协议。

或者您也可以在Interface Builder中设置UITableViewDataSource作为其委托和ViewController(我认为更容易)并避免在上面的代码中手动设置。由你决定。

我希望这对你有所帮助。

答案 1 :(得分:19)

每个人都提到要设置dataSource和删除tableView。 但是在设置后也无法正常工作,有时可能会由于无显示或禁用对表视图的选择而发生。

启用它 转到情节提要->选择tableView->单击属性检查器->转到选择器->将选择作为单选(或根据需要选择多选)。Please find attachment

请找到适合您的屏幕截图。

答案 2 :(得分:16)

SWIFT 3

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      // Do here
    }

在swift 3中使用上面的委托方法

答案 3 :(得分:8)

我在比较两个相同的代码示例时遇到了同样的问题,其中一个代码运行良好而另一个代码未调用didSelectRowAtIndexPath

看看解决问题的两种可能方法:

1)在代码本身:

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    table.delegate = self
    table.dataSource = self 
//data source might be already set if you see contents of the cells
//the main trick is to set delegate
}

2)使用故事板或文档大纲(这是我的问题导致故事板更改在.swift控制器类中不可见。

打开文档大纲并Control + Press TableView delegate 你会看到两个名为" dataSource"和" ViewController" 将它们逐个拖动到包含BOOT TIMEOUT(右侧到黄色圆圈)

那就是它!

答案 4 :(得分:4)

  • 可以帮助您的支票夫妇:-

    myTableView.allowsSelection = true

    myTableView.delegate = self

  • 确保正确编写了didSelectRowAt

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

  • 如果您在UIButton上使用UITableViewCell,则它与单元格重叠,因此请选中Solution here

答案 5 :(得分:2)

你必须使用它:首先看看你扩展了什么,然后使用tableView方法。

    class YourViewController : UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var mUITableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // We need to tell to UITableView that we will add the data by ourselves
        self.mUITableView.delegate = self
        self.mUITableView.dataSource = self

        // Register the UITableViewCell class with the tableView
        self.mUITableView?.registerClass(UITableViewCell.self, forCellReuseIdentifier: self.cellIdentifier)
        // Setup table data
        getEvents()

        self.mUITableView.allowsSelection = true   
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tableData.count
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
       //  here to create you cell view      
    }

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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "subtitleCell")
        cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
        cell.textLabel?.text = "\(tableData[indexPath.row].name) - (\(tableData[indexPath.row].eventStateId))"
        cell.detailTextLabel?.text = tableData[indexPath.row].lastUpdate
        return cell
    }
}

答案 6 :(得分:1)

我花了很长时间才弄清楚的另一个警告是,确保您的表视图,单元格和内容视图中的所有三个都启用了用户交互。然后,至少在Swift 4中,您可以使用:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

答案 7 :(得分:1)

另一个警告是点击手势识别器。使用轻击手势识别来处理带有表视图的视图控制器中的不同逻辑是一种常见的用例,无论是退出触摸控制还是急救人员。

  let tapGesture = UITapGestureRecognizer(target: self, action: #selector(viewTapped))
  view.addGestureRecognizer(tapGesture)

E.G。此行代码可用于关闭应用程序中的日期选择器,并防止我的表视图调用didSelectRow委托方法

答案 8 :(得分:0)

您可能会编写此函数的另一个原因,该条件允许在条件下单击

func tableView(_ tableView: UITableView, shouldHighlightRowAt indexPath: IndexPath) -> Bool {
    if(indexPath.section == 1){
        return true
    }
    return false
}

答案 9 :(得分:0)

要检查的另一件事是您的类和方法的访问级别:

我有一个标记为 @objc public 的 Swift UIViewController 类,以使其对我的 Objective-c 代码可见。

在这种情况下,您必须添加对该函数的公共访问权限,否则将不会被调用。

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

答案 10 :(得分:-1)

如果您正在编辑tableView:

tableView.allowsSelectionDuringEditing = true