嗨,大家好我陷入困境,无法在任何地方找到解决方案。任何人都可以告诉我这是什么问题,我刚刚开始学习swift我想从我的firebase数据库中获取数据并将其打印在uitableviewcell上
我创建了一个具有
的swift文件类别类别:NSObject { var类别:字符串? }
我的Viewcontroller位于
之下import UIKit
import FirebaseDatabase
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var categoryList = [Categories]()
var refHandle:UInt!
var ref:FIRDatabaseReference?
@IBOutlet weak var listOfCategories: UITableView!
@IBOutlet weak var menuBtn: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
ref = FIRDatabase.database().reference()
menuBtn.target = revealViewController()
menuBtn.action = #selector(SWRevealViewController.revealToggle(_:))
fetchCategories()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return categoryList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
// Set cell content
cell.textLabel?.text = categoryList[indexPath.row].categories
return cell
}
func fetchCategories(){
refHandle = ref?.child("Categories").observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
print(dictionary)
let categories = Categories()
categories.setValuesForKeys(dictionary)
self.categoryList.append(categories)
DispatchQueue.main.async
{
self.listOfCategories.reloadData()
}
}
})
}
}
我的数据库
-Categories
-name
Bikes:"Bikes"
Cars:"Cars"
Cats:"Cats"
如果我打印(categorList)我也不会在控制台上得到它..下面是日志
2017-04-06 06:09:50.531壁纸应用[1716] [Firebase / Analytics] [I-ACS023007] Firebase Analytics v.3700000已启动 2017-04-06 06:09:50.534壁纸应用[1716] [Firebase / Analytics] [I-ACS023008]启用调试日志记录设置 以下应用程序参数:-FIRAnalyticsDebugEnabled(请参阅 http://goo。 gl / RfcP7r)2017-04-06 06:09:50.565壁纸应用[1716] [Firebase / Analytics] [I-ACS003007]已成功创建 Firebase Analytics App会自动委派代理。要禁用 代理,将标志FirebaseAppDelegateProxyEnabled设置为NO Info.plist 2017-04-06 06:09:50.580壁纸应用[1716] [Firebase / Analytics] [I-ACS005000] AdSupport Framework不是 目前已联系。某些功能无法正常运行。学到更多 在http://goo。 gl / 9vSsPb 2017-04-06 06:09:50.589壁纸应用[1716] [Firebase / Analytics] [I-ACS023012]已启用Firebase Analytics [“汽车”:汽车,“自行车”:自行车,“猫”:猫] 2017-04-06 06:09:52.565 壁纸应用程序[1716:28745] *由于未被捕获而终止应用程序 异常'NSUnknownKeyException',原因: “[ setValue:forUndefinedKey:]:此类不是键值 符合编码标准的关键汽车。' * 第一次抛出调用堆栈:(0 CoreFoundation 0x0000000104725d4b exceptionPreprocess + 171 1 libobjc.A.dylib
类型的未捕获异常
0x0000000103d6621e objc_exception_throw + 48 2 CoreFoundation
0x0000000104725c99 - [NSException raise] + 9 3基金会 0x00000001038749df - [NSObject(NSKeyValueCoding)setValue:forKey:] + 291 4基金会0x00000001038d672f - [NSObject(NSKeyValueCoding)setValuesForKeysWithDictionary:] + 301 5壁纸App 0x00000001026fe886 _TFFC14Wallpapers_App14ViewController15fetchCategoriesFT_T_U_FCSo15FIRDataSnapshotT_ + 1126 6壁纸App 0x00000001026fed8c _TTRXFo_oCSo15FIRDataSnapshot__XFdCb_dS _ + 60 7壁纸App 0x00000001027c85b0 63- [FIRDatabaseQuery observeEventType:withBlock:withCancelBlock:] _ block_invoke + 37 8
壁纸App 0x00000001027efeb3 __43- [FChildEventRegistration fireEvent:queue:] _ block_invoke.68 + 88 9 libdispatch.dylib 0x0000000107470978 _dispatch_call_block_and_release + 12 10 libdispatch.dylib 0x000000010749a0cd _dispatch_client_callout + 8 11 libdispatch.dylib 0x000000010747a8a4 _dispatch_main_queue_callback_4CF + 406 12 CoreFoundation 0x00000001046e9e49 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE + 9 13 CoreFoundation 0x00000001046af37d __CFRunLoopRun + 2205 14 CoreFoundation 0x00000001046ae884 CFRunLoopRunSpecific + 420 15图形服务
0x0000000109439a6f GSEventRunModal + 161 16 UIKit
0x000000010525cc68 UIApplicationMain + 159 17壁纸应用
0x0000000102701fcf main + 111 18 libdyld.dylib
0x00000001074e668d start + 1)libc ++ abi.dylib:终止于 NSException(lldb)
答案 0 :(得分:0)
您正在使用方法
setValuesForKeys
此方法说明说:
Sets properties of the receiver with values from a given dictionary, using its keys to identify the properties.
你的错误说,你的类别类不符合键值"汽车",因为没有名为"汽车"在你的"类别"类。
从我看到的,您正在尝试在UITableViewCell中打印所有这些类别。我建议将您的Categories类更改为以下内容:
struct Category() {
var key: String
var value: String
}
发布,当你在fetchCategories()方法中得到响应时。解析那个词典:
for (key, value) in dictionary {
let category = Category(key: key, value: value as! String)
self.listOfCategories.append(category)
}
在你的cellForRowAtIndexPath中。您可以像这样设置文本。
cell.textLabel?.text = categoryList[indexPath.row].value
如果您只需要从Firebase收到的响应中的值,则可能需要简化Category结构。然后你的结构变得简单:
struct Category() {
var name: String
}
我更喜欢在任何可能的地方使用结构,但如果你真的想要,你可以使用一个类。
答案 1 :(得分:0)
在我看来,你有两个问题 1)显示单元格中的数据 2)打印数据,以便您可以看到它
我会解决2)因为我认为一旦你看到数据,你可以使用它(至少这是我的经验 - 对Xcode来说也是相当新的)
Xcode并不像我们想的那样“简单”打印数据....(你可能会发现它像我一样令人沮丧 - 来自JS / jQuery / PHP背景)
我觉得最简单的方法是使用名为“SimpleJSON”的插件(还有其他的,这是我认为适合我的目的)并将数据带到JSON包中,在那里我可以看到数据(整个想法) ,对吗?),然后根据需要从那里开始工作。
在pod文件中,只需添加
import SwiftyJSON
然后在您想要查看数据的代码中
let categoriesJSON = JSON(categories)
print(categoriesJSON)
从那里开始,你将获得一个在数组中使用的列表
print(categoriesJSON["name"]["Cars"]
也许不是一个完全'Swift-y'的解决方案,但是它完成了工作!