我的目标是制作一个分组的tableView,但不知何故数据没有添加到表View
这是故事板图片
我写的代码似乎无法正常工作
import UIKit
import Alamofire
import SwiftyJSON
import KeychainAccess
class SettingsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
let keychain = Keychain(server: "https://genietesting.herokuapp.com", protocolType: .HTTPS)
var profile: [String]?
let aboutGenie = [
"How it works",
"About",
"Contact"
]
override func viewDidLoad() {
super.viewDidLoad()
let firstName = keychain[string: "first_name"]
profile = [
firstName!
]
tableView.dataSource = self
tableView.delegate = self
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 2
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return profile!.count
} else {
return aboutGenie.count
}
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if section == 0 {
return "Profile"
} else {
return "About Genie"
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let tableCell = tableView.dequeueReusableCellWithIdentifier("myCell")
return tableCell!
}
}
当然,我想让它可以点击,以便它可以转到它自己的viewController
经过一些建议后,我更改了上面的大部分代码,但结果仍然相同,但这次显示了标题
结果是
答案 0 :(得分:2)
airsoftFreak,
我可以找出多个错误
所以你必须拥有像
这样的东西@IBOutlet var tableView: UITableView!
您的SettingsViewController仅确认UITableViewDataSource而不是UITableViewDelegate。如果你想要触发didSelectRowAtIndexPath,你必须确认UITableViewDelegate
class SettingsViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
正如许多人在他们的回答中注意到并提到的那样,你必须将你的viewController设置为UITableViewDelegate,UITableViewDataSource的委托,所以
self.tableView.dataSource = self
self.tableView.delegate = self
你实例化单元格的方式也是错误的:) Yopu不应该每次为每个单元创建tableViewCell :)在storyBoard中转到你的TableView添加一个原型单元格,按你想要的方式装饰它并设置reusableIndentifier
为此。让我们说你设置的reusableIndentifier是'myCell'
您的cellForRowAtIndexPath将更改为
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//assuming you have different cells for each section
switch indexPath.section {
case 0: let tableCell = tableView.dequeueReusableCellWithIdentifier("myCell")
tableCell.textLabel.text = profile[indexPath.row]
return tableCell
//in swift switch has to be exhaustive so default
default: let secondSectionCell = tableView.dequeueReusableCellWithIdentifier("second_section_cell_identifier")
secondSectionCell.textLabel.text =aboutGenie[indexPath.row]
return secondSectionCell
}
}
答案 1 :(得分:0)
尝试将tableview拖动(ctrl + 拖动)到viewcontroller顶部的黄色按钮。您现在将看到选项:datasource和delegate。选择其中一个并再次为另一个执行操作。现在tableview应该链接到你的代码。
如果使其可点击的选项也是一个问题:
使用函数didSelectRowAtIndexpath
,您可以实现此目的。关于这个问题应该有很多堆栈。
答案 2 :(得分:0)
您可能尚未将UITableView
delegate
和dataSource
方法连接到viewController
。你可以用两种方式做到这一点。
1.编程
创建一个tableViewOutlet
override fun viewDidLoad() {
super.viewDidLoad()
yourTableViewOutlet.delegate = self
yourTableViewOutlet.dataSource = self
}
a)在故事板中打开文档大纲。 b)控制从tableView拖动到ViewController。 c)逐个连接delegate和dataSource。
单击该单元格将触发delegate
方法didSelectRowAtIndexPath
答案 3 :(得分:0)
self.tableView.delegate和self.tableView.datasource
override func viewDidLoad() {
super.viewDidLoad()
let firstName = keychain[string: "first_name"]
profile = [
firstName!
]
self.tableView.delegate = self
self.tableView.datasource = self
}