在viewController上添加了一个tableview,但数据不存在

时间:2016-05-23 07:52:01

标签: ios swift uitableview

我的目标是制作一个分组的tableView,但不知何故数据没有添加到表View

这是故事板图片

enter image description here

我在视图控制器顶部添加了一个表视图 enter image description here

我写的代码似乎无法正常工作

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

经过一些建议后,我更改了上面的大部分代码,但结果仍然相同,但这次显示了标题

结果是

enter image description here

4 个答案:

答案 0 :(得分:2)

airsoftFreak,

我可以找出多个错误

  1. 您的tableView没有IBOutlet,它添加在ViewController之上。
  2. 所以你必须拥有像

    这样的东西
    @IBOutlet var tableView: UITableView!
    
    1. 您的SettingsViewController仅确认UITableViewDataSource而不是UITableViewDelegate。如果你想要触发didSelectRowAtIndexPath,你必须确认UITableViewDelegate

      class SettingsViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {

    2. 正如许多人在他们的回答中注意到并提到的那样,你必须将你的viewController设置为UITableViewDelegate,UITableViewDataSource的委托,所以

      self.tableView.dataSource = self

      self.tableView.delegate = self

    3. 你实例化单元格的方式也是错误的:) Yopu不应该每次为每个单元创建tableViewCell :)在storyBoard中转到你的TableView添加一个原型单元格,按你想要的方式装饰它并设置reusableIndentifier为此。让我们说你设置的reusableIndentifier是'myCell'

    4. 您的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 delegatedataSource方法连接到viewController。你可以用两种方式做到这一点。 1.编程  创建一个tableViewOutlet

override fun viewDidLoad() {
   super.viewDidLoad()
   yourTableViewOutlet.delegate = self
   yourTableViewOutlet.dataSource = self
}
    在interfaceBuilder中
  1. a)在故事板中打开文档大纲。 b)控制从tableView拖动到ViewController。 c)逐个连接delegate和dataSource。

  2. 单击该单元格将触发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
}