在UiTableViewCell Swift 3

时间:2017-04-06 13:11:55

标签: ios uitableview firebase swift3 firebase-realtime-database

嗨,大家好我陷入困境,无法在任何地方找到解决方案。任何人都可以告诉我这是什么问题,我刚刚开始学习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)

类型的未捕获异常

2 个答案:

答案 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'的解决方案,但是它完成了工作!