Swift - 表视图未填充数据但未显示错误

Posted

技术标签:

【中文标题】Swift - 表视图未填充数据但未显示错误【英文标题】:Swift - Table View not populating with data but shows no errors 【发布时间】:2016-07-01 17:49:47 【问题描述】:

使用以下教程,我尝试显示一些将填充到表格中的股票信息。我已经创建了表格视图控制器以及表格视图单元格,并将 stockTableViewCell 与表格视图单元格链接。但是我无法将主故事板上的 tableview 与自定义 table view 控制器链接。

基本上每次我尝试将它输入到自定义类字段时它都不适用,当我离开时它消失

我的问题是,我的视图控制器或表格视图单元是否有问题,或者我的情节提要中有什么配置错误?

教程:https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson7.html

表格视图控制器

import UIKit

class stocksTableViewController: UITableViewController

    // Mark: Properties

    var stocks = [stockData]()
    let stock = stockinfo()

    override func viewDidLoad() 
        super.viewDidLoad()
        loadSampleStockData()

    

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

    func loadSampleStockData () 

        var stock1: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "")
        var stock2: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "")
        var stock3: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "")

        stock.getInfo("FB") (name, price, change) in dispatch_async(dispatch_get_main_queue(),
            stock1 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "FB"))
        

        stock.getInfo("MSFT") (name, price, change) in dispatch_async(dispatch_get_main_queue(),
            stock2 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "MSFT"))
        

        stock.getInfo("APPL") (name, price, change) in dispatch_async(dispatch_get_main_queue(),
            stock3 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "APPL"))
        

        stocks += [stock1, stock2, stock3]
    

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

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

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

        let cellIdentifier = "stockViewCell"

        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! stockTableViewCell

        let stock = stocks[indexPath.row]

        cell.stockName.text = stock.name
        cell.stockPercentage.text = stock.percentageChange
        cell.stockDollarChange.text = stock.askPrice
        cell.stockTicker.text = stock.stockTicker

        return cell
    

表格视图单元格

import Foundation
import UIKit

class stockTableViewCell: UITableViewCell 

    // Properties

    @IBOutlet weak var stockTicker: UILabel!
    @IBOutlet weak var stockPercentage: UILabel!
    @IBOutlet weak var stockName: UILabel!
    @IBOutlet weak var stockDollarChange: 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
    

【问题讨论】:

你在哪里打电话给tableView.reloadData() 你指的是 loadSampleStockData(),我在 viewDidLoad() 函数中调用了它,还是你问的不是这个? 我指的是上面的代码 在那种情况下,我不相信我会这样做!感谢您了解这一点。 【参考方案1】:

您实际上需要在 viewDidLoad()

中注册您的 customtableviewcell

您还可以查看以下链接

http://www.mysamplecode.com/2013/06/ios-custom-uitableviewcell-example.html

【讨论】:

谢谢!由于我对开发还很陌生,因此我阅读了您提供的链接,但是对于如何在视图控制器的 viewDidLoad() 中注册我的 customtableviewcell 仍然有点迷茫。非常感谢您的帮助! 我尝试使用这个:tableView.registerClass(stockTableViewCell, forCellReuseIdentifier: "stockViewCell") 来注册类,但我仍在试图弄清楚如何使用这个调用,因为我现在正在出现错误。 请查看链接显示的示例代码@MarkGong-Guy 如果一切都是在 Interface Builder 中设计的——就像 Apple 教程中建议的那样——你不需要注册任何东西。【参考方案2】:

如果不查看您的项目,不确定您遇到了什么问题,但您想在自定义类中输入什么?您应该输入 stockTableViewController 并且它应该可以工作,除非您没有在情节提要上拖入 TableViewController。而且您无需在 viewDidLoad 中注册您的单元格,请忽略该评论。

这里使用这个更新的代码,你正在尝试将两种类型的视图控制器设置为故事板上的一个视图,将此代码放入你的类 dashboardViewController 中,这应该会让你走上正确的轨道,不要忘记连接当您实现它时,此代码上的 tableView 属性的出口。

class dashboardViewController: DefaultViewController,     UITableViewDataSource, UITableViewDelegate 

  @IBOutlet weak var tableView: UITableView!
  @IBOutlet weak var balanceLabel: UILabel!

  var stocks = [stockData]()
  let stock = stockinfo()

      override func viewDidLoad() 
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
    loadSampleStockData()
    user.newUser() // Move to login function when login and registration is implemented

//Sets the Balance Label on Dashboard
balanceLabel.text = "$" + String(format: "%.2f", user.getBalance())
  

 func loadSampleStockData () 

var stock1: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "")
var stock2: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "")
var stock3: stockData = stockData(name: "", askPrice: "", percentageChange: "", stockTicker: "")

stock.getInfo("FB") (name, price, change) in dispatch_async(dispatch_get_main_queue(),
  stock1 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "FB"))
    

stock.getInfo("MSFT") (name, price, change) in dispatch_async(dispatch_get_main_queue(),
  stock2 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "MSFT"))


stock.getInfo("APPL") (name, price, change) in dispatch_async(dispatch_get_main_queue(),
  stock3 = stockData(name: name, askPrice: price, percentageChange: change, stockTicker: "APPL"))


stocks += [stock1, stock2, stock3]
  

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

 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
  return stocks.count
  

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

let cellIdentifier = "stockViewCell"

let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! stockTableViewCell

let stock = stocks[indexPath.row]

cell.stockName.text = stock.name
cell.stockPercentage.text = stock.percentageChange
cell.stockDollarChange.text = stock.askPrice
cell.stockTicker.text = stock.stockTicker

return cell
    `
  

【讨论】:

您要填充哪个 TableView?仪表板上的那个?文件夹? AddStock 还是排行榜?此外,所有这些视图都是 ViewController,因此您的 UITableViewController 不适合自定义类部分。 我正在尝试将其填充到仪表板中。哦,我明白了。我将如何解决它?非常感谢 zsteed,我是 iOS 开发的新手,所以我还在学习基础知识。附言。我使用视图和视图控制器的方式正确吗? 看起来很有效。但现在我收到此错误:无法将“NSNull”(0x1a1934bc0)类型的值转换为“NSString”(0x1a193f7e8)。有什么想法吗?再次@zsteed,我非常感谢你的帮助。 无需过多地进入您的网络,只需将您的代码更改为这个,它现在将是一个快速修复,但可能不会长期解决问题 let companyName: String = quote[ “名称”] 为?细绳 ?? "" let askPrice: String = quote["Ask"] as?细绳 ?? "" let percentChange: String = quote["ChangeinPercent"] as?细绳 ?? "",祝你好运 如果这些解决了您的问题,请用支票标记我的答案。【参考方案3】:

我看到了你的项目,我有几点可以帮助你:

    您的搜索字段没有出口。您插入了 UISearchDisplayController 但未与您的类 AddStockViewController 连接。 最重要的UISearchDisplayerController 已弃用,请尝试使用 UISearchController 或 UISearchBar。

o/

【讨论】:

非常感谢,我一定会做出这些改变。感谢您查看我的项目并给我反馈!

以上是关于Swift - 表视图未填充数据但未显示错误的主要内容,如果未能解决你的问题,请参考以下文章

用数据填充视图中的表格视图,swift2

表视图数据未在 Alamofire 发布请求调用 swift 3 中显示

用户输入的值保存到 Core Data (?) 但未出现在表视图中

在 SWIFT 的表视图中填充自定义单元格时出错

用 json 数据 swift 4 填充表视图

在 Swift 中使用 JSON 对象填充表视图