【问题标题】:Why is my tableViewController not loading any data?为什么我的 tableViewController 没有加载任何数据?
【发布时间】:2016-07-19 10:52:04
【问题描述】:

我正在创建一个应用程序,其中 ViewController 中的不同按钮将不同的菜单加载到 tableViewController 中。按钮由准备转场链接,菜单(数组)由 contentMode 链接。 1:早餐菜单和 2:午餐菜单。我得到了设置它的人的帮助,但现在表格没有加载任何数据......该单元格有 3 个标签,显示项目、信息和价格。选择ContentMode时,它会在代码中更改值。有人在我的代码中看到问题吗?非常感谢!

import UIKit

class foodMenuController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let foodMenuController = segue.destinationViewController as! foodTableViewController

  if segue.identifier == "showBreakfast" {
            foodMenuController.contentMode = 1
    } else if segue.identifier == "showLunch" {
        foodMenuController.contentMode = 2
        }
    }


}

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

import UIKit

class foodTableViewCell: UITableViewCell {

@IBOutlet weak var foodItem: UILabel!
@IBOutlet weak var foodDescription: UILabel!
@IBOutlet weak var foodPrice: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

import UIKit

class foodTableViewController: UITableViewController {

//Content Mode Selection in menu
var contentMode = 0

// THIS SHOULD BE LOADED WHEN CONTENT MODE is "1" --> BREAKFAST
let breakfastItems = ["Bread", "Coffee", "Nada"]
let breakfastInfo = ["Good", "Nice", "Nothing"]
let breakfastPrice = ["$1", "$100", "$12,40"]

// THIS SHOULD BE LOADED WHEN CONTENT MODE IS "2" --> LUNCH
let lunchItems = ["Not bread", "Not Coffee", "Something"]
let lunchInfo = ["Not good", "Not nice", "Yes"]
let lunchPrice = ["$1", "$100", "$12,40"]

var foodItems: [String] = []
var foodInfo: [String] = []
var foodPrice: [String] = []

override func viewDidLoad() {
    super.viewDidLoad()
    }

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)
    switch (contentMode){
    case 1: contentMode = 1
        foodItems = breakfastItems
        foodInfo = breakfastInfo
        foodPrice = breakfastPrice
    case 2: contentMode = 2
        foodItems = lunchItems
        foodInfo = lunchInfo
        foodPrice = lunchPrice
    default:
        break
    }
    tableView.reloadData()
}


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

}

// Table view data source

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

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

}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cellIdentifier = "Cell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! foodTableViewCell

    cell.foodItem.text = foodItems[indexPath.row]
    cell.foodDescription.text = foodInfo[indexPath.row]
    cell.foodPrice.text = foodPrice[indexPath.row]

        return cell


    }
}

【问题讨论】:

  • 如果您回答了这个问题,那么您应该标记并关闭它。它已经是重复的了。不要让它打开。另请注意缺少的点。还要确保您遵循通用命名标准。 class 名称必须以大写字符开头。
  • 对不起@Mathews,但我处理这个问题已经太久了,所以我只是急于解决它。但是,我只是打印了这个值,它确实以 contentMode "0" 的形式返回,所以我必须看看问题出在哪里。
  • 所以请看一下FoodMenuViewController中的prepareForSegue方法。如果 segue 标识符错误,它将不会根据需要设置 contentMode
  • @Mathews - 检查了故事板和代码中的 prepareForSegue 标识符,两者都相同....所以我真的不知道为什么它没有将 contentMode 更改为 1?...顺便说一句谢谢虽然到目前为止你帮了很大的忙!我只是想让这个工作....
  • 请你上传`xcodeProject`文件。这将有助于调试。

标签: ios arrays swift uitableview tableview


【解决方案1】:

您共享的 sn-p 没有任何明显错误。您可以检查 tableView:numberOfRowsInSection: 方法中返回的内容,看看它是否返回值 > 0

另外,这是给定的,但我们都在某个时间点完成了 - 检查以确保 tableview 委托和数据源设置为您的视图控制器。

【讨论】:

  • 他已经在继承UITableViewController ;视图层次结构以及委托/数据源应该正确连接(除非他不小心拆线)。所以这应该差不多离开tableView:numberOfRowsInSection:...?
  • 我检查了 segue 标识符,它们是正确的......数据仍然没有加载?我在这里想念什么?有人有想法吗?不想重新发布问题......如果连专家都不知道发生了什么,这只会变得荒谬......我应该上传文件吗?
  • @Kevin 就像我说的那样,代码显然没有任何问题。在viewWillAppear: 中执行reloadData 后,您是否检查过numberOfRowsInSection: 的计数是否正确?这可能会给你一个提示
  • @lostInTransit - 我非常感谢您的帮助!但现在你必须清楚我是编程方面的绝对 NOOB。我仍在学习为什么和如何,虽然这对你来说似乎很明显,但我在 numberOfRowsInSection 中遗漏了一些东西:......我不知道提示是什么......因为我不知道如何检查计数。 .. :(
  • 通过程序调试,在方法中下断点,检查foodItems.count有什么
【解决方案2】:

我对您的项目进行了轻微修改。 1. 将UINavigationController 设为InitialViewController 2.使FoodMenuController成为UINavigationController的根

现在修改你的FoodMenuController

@IBOutlet weak var bakeryButton: UIButton!
@IBOutlet weak var breakfastButton: UIButton!
override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.navigationBarHidden = true //hide navigationBar in first ViewController
    self.bakeryButton.addTarget(self, action: "bakeryButtonAction:", forControlEvents: .TouchUpInside)
    self.breakfastButton.addTarget(self, action: "breakfastButtonAction:", forControlEvents: .TouchUpInside)
}

func bakeryButtonAction(sender: UIButton) {
    performSegueWithIdentifier("showLunch", sender: self)
}

func breakfastButtonAction(sender: UIButton) {
    performSegueWithIdentifier("showBreakfast", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let foodTableViewController: FoodTableViewController = segue.destinationViewController as! FoodTableViewController

    if segue.identifier == "showBreakfast" {
        foodTableViewController.contentMode = 1
    } else if segue.identifier == "showLunch" {
        foodTableViewController.contentMode = 2
    }
}

您还可以使UINavigationBarFoodTableViewController 中可见

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.navigationBarHidden = false
    }

PS:最好不要直接将 segue 添加到 UIButton。或者,您可以从FoodMenuController 顶部的黄色按钮添加它,并使用performSegueWithIdentifier 指定要在UIButtonAction 中触发的segue

【讨论】:

  • 谢谢一百万老兄!!!!最后它起作用了..你能简要解释一下为什么吗?否则我只是在复制东西.. 你是说我应该更改为 segue 准备执行 segue 并给按钮一个标识符?
  • 那不正确。 1. PerformSegueWithIdentifier:执行时将触发具有给定标识符的segue。接下来执行PrepareForSegue 方法。 2.PrepareForSegue:重写此方法以配置要在segue 上传递的数据。您可以将ViewController 中的segue 添加到目的地,而不是直接segue。现在为UIButtons 创建outlets 并为按钮添加操作
  • 现在,如果答案令人满意,请将其标记为答案,以便问题结束。
  • 我将修改上面的答案,并集成performSegueWithIdentifier。您必须删除当前的 segues 并从 ViewController 上的黄色图标添加它们
【解决方案3】:

我在哪里看不到你设置 tableView 的数据源和委托,请交叉检查这些都是设置。

【讨论】:

  • 控制器类已经是UITableViewController的子类。所以dataSourcedelegate 默认连接到控制器类。查看@Nicolas 的评论
  • 我试过你的代码。它可以正常工作。我将 xcode 项目与您的代码一起附加。 drive.google.com/file/d/0Bwftp_LIDNUQcTd2cXA0TVB2THc/…
  • 谢谢。但是您仍然在UIViewController 中使用UITableView。在这个问题中,我们正在处理UITableViewController。所以我们不必担心dataSourcedelegate。所有这些都由UITableViewController 自己处理。
  • No no .. 点击单元格将带您进入 tableviewcontroller 类
猜你喜欢
  • 1970-01-01
  • 2012-05-20
  • 2021-07-23
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2012-01-09
  • 1970-01-01
相关资源
最近更新 更多