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
您还需要将UITableView
的delegate
连接到情节提要中的ViewController。或者,如果您有 @IBOutlet
到 UITableView
,您也可以在代码中执行此操作。反正不止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 语句