Swift 3 中的“didSelectRowAt indexPath”问题

Posted

技术标签:

【中文标题】Swift 3 中的“didSelectRowAt indexPath”问题【英文标题】:Issue with "didSelectRowAt indexPath" in Swift 3 【发布时间】:2017-01-01 20:36:33 【问题描述】:

我对 swift 还很陌生,但大部分时间我都设法跟上了。但是,我的代码存在一个问题,即代码本身甚至无法识别(我没有收到任何错误迹象)。我正在尝试单击表格视图中的一行以使其转到下一页,但我认为代码无法识别 didselectrow 方法。也许你们中的一位更有经验的人可以帮助我。

代码如下:

import UIKit
import Foundation

class OnePercentersViewController: UIViewController, UITableViewDataSource


    var copiedExecutiveArray : [String] = NSArray() as! [String]
    var identities : [String] = NSArray() as! [String]

    override func viewDidLoad()
    
        super.viewDidLoad()
        let copyExecutiveNames : ExecutiveArray = ExecutiveArray()
        copiedExecutiveArray = copyExecutiveNames.executiveNames
        identities = copyExecutiveNames.executiveNames
    

    //how many sections in table
    func numberOfSections(in tableView: UITableView) -> Int
    
        return 1
    

    //returns int (how many rows)
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    
        return copiedExecutiveArray.count
    

    //contents of each cell
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")//UITableViewCell()
        let personName = copiedExecutiveArray[indexPath.row]
        cell?.textLabel?.text = personName
        return cell!

    

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

        let execName = identities[indexPath.row]
        let viewController = storyboard?.instantiateViewController(withIdentifier: execName)
        self.navigationController?.pushViewController(viewController!, animated: true)
        print("button clicked")
        tableView.deselectRow(at: indexPath as IndexPath, animated: true)
    


【问题讨论】:

不相关但var identities : [String] = NSArray() as! [String] 太可怕了。简单写var identities = [String]() 【参考方案1】:

我没有检查你代码的其他部分,但是为了使tableView(_:didSelectRowAt:) 工作,你的ViewController 需要符合UITableViewDelegate

class OnePercentersViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

您还需要将UITableViewdelegate 连接到情节提要中的ViewController。或者,如果您有 @IBOutletUITableView,您也可以在代码中执行此操作。反正不止dataSource,还有delegate


这不是一个关键问题,但你可以将类的前两行写成:

var copiedExecutiveArray : [String] = []
var identities : [String] = []

【讨论】:

谢谢,我试试看。【参考方案2】:

在花了一天半的时间观看 Youtube 视频并阅读 cmet 以解决类似问题后,tt 反复试验,但我终于得到了感谢你们!当我读到我必须将代表连接到ViewController 通过情节提要,非常感谢!

这是有类似问题的最终代码:

    import UIKit
    import Foundation

    class OnePercentersViewController: UIViewController,UITableViewDataSource, UITableViewDelegate
    

var copiedExecutiveArray : [String] = []
var identities : [String] = []

override func viewDidLoad()

    super.viewDidLoad()
    let copyExecutiveNames : ExecutiveArray = ExecutiveArray()
    copiedExecutiveArray = copyExecutiveNames.executiveNames
    identities = copyExecutiveNames.executiveNames


//how many sections in table
func numberOfSections(in tableView: UITableView) -> Int

    return 1


//returns int (how many rows)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int

    return copiedExecutiveArray.count


//contents of each cell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    let personName = copiedExecutiveArray[indexPath.row]
    cell.textLabel?.text = personName
    return cell


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

    let execName = identities[indexPath.row]
    let viewController = storyboard?.instantiateViewController(withIdentifier: execName)
    self.navigationController?.pushViewController(viewController!, animated: true)
    tableView.deselectRow(at: indexPath as IndexPath, animated: true)




    

【讨论】:

如何通过情节提要连接代理? :(

以上是关于Swift 3 中的“didSelectRowAt indexPath”问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中从情节提要中的 didSelectRowAt indexPath 打开视图标签栏控制器?

didSelectRowAt Swift 3 即使在设置了委托和数据源后也没有调用

Swift 4:没有调用 didSelectRowAt 委托

Swift 中 didSelectRowAt 函数上的 Switch 语句

Swift UITableView 仅在我按下几秒钟时调用 didSelectRowAt

Swift - didSelectRowAt indexPath 下一个 VC 没有出现/没有故事板/