codddeer123 codddeer123 - 4 years ago 169
iOS Question

Swift with Firebase in simple app - lldb error

I was following the tutorial on the official Firebase youtube account (https://www.youtube.com/watch?v=joVi3thZOqc) but it seemes outdated so I had to read a documentation and apply couple of changes to get this simple app to work properly. I get lldb error in AppDelegate.swift file:

import UIKit
import Firebase
import FirebaseDatabase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate { //error here

var window: UIWindow?

override init(){
FIRApp.configure()
}

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}


ViewController.swift file:

import UIKit
import Firebase
import FirebaseDatabase

class ViewController: UIViewController {

//FBDataBase variables
var ref: FIRDatabaseReference = FIRDatabase.database().reference() //root directory

//interface variables
@IBOutlet weak var label: UILabel!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)

ref.observe(.value) { (snapshot) in
self.label.text = snapshot.value as? String
}
}

//interface functions
@IBAction func sunnyPressed(_ sender: Any) {
ref.child("condition").child("addedByUser").setValue("sunny")
}

@IBAction func foggyPressed(_ sender: Any) {
ref.child("condition").child("addedByUser").setValue("foggy")

}
}


console log:

2017-02-05 13:12:40.738 fireDataBaseTest[4745:140438] Firebase automatic screen reporting is enabled. Call +[FIRAnalytics setScreenName:setScreenClass:] to set the screen name or override the default screen class name. To disable automatic screen reporting, set the flag FirebaseAutomaticScreenReportingEnabled to NO in the Info.plist
2017-02-05 13:12:40.848 fireDataBaseTest[4745] <Debug> [Firebase/Core][I-COR000001] Configuring the default app.
2017-02-05 13:12:40.864 fireDataBaseTest[4745:] <FIRAnalytics/INFO> Firebase Analytics v.3600000 started
2017-02-05 13:12:40.865 fireDataBaseTest[4745:] <FIRAnalytics/INFO> To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/...)
2017-02-05 13:12:40.870: <FIRInstanceID/WARNING> FIRInstanceID AppDelegate proxy enabled, will swizzle app delegate remote notification handlers. To disable add "FirebaseAppDelegateProxyEnabled" to your Info.plist and set it to NO
2017-02-05 13:12:40.913 fireDataBaseTest[4745:] <FIRAnalytics/INFO> Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2017-02-05 13:12:41.027 fireDataBaseTest[4745:140438] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<fireDataBaseTest.ViewController 0x7fd09e60e1f0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key foggyPressed.'
*** First throw call stack:
(
0 CoreFoundation 0x00000001110cdd4b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x0000000110b2f21e objc_exception_throw + 48
2 CoreFoundation 0x00000001110cdc99 -[NSException raise] + 9
3 Foundation 0x000000011063d9df -[NSObject(NSKeyValueCoding) setValue:forKey:] + 291
4 UIKit 0x0000000111d9f293 -[UIViewController setValue:forKey:] + 88
5 UIKit 0x000000011201379e -[UIRuntimeOutletConnection connect] + 109
6 CoreFoundation 0x00000001110729e0 -[NSArray makeObjectsPerformSelector:] + 256
7 UIKit 0x0000000112012122 -[UINib instantiateWithOwner:options:] + 1867
8 UIKit 0x0000000111da59c5 -[UIViewController _loadViewFromNibNamed:bundle:] + 386
9 UIKit 0x0000000111da62e7 -[UIViewController loadView] + 177
10 UIKit 0x0000000111da661c -[UIViewController loadViewIfRequired] + 201
11 UIKit 0x0000000111da6e70 -[UIViewController view] + 27
12 UIKit 0x0000000111c704b5 -[UIWindow addRootViewControllerViewIfPossible] + 71
13 UIKit 0x0000000111c70c06 -[UIWindow _setHidden:forced:] + 293
14 UIKit 0x0000000111c84519 -[UIWindow makeKeyAndVisible] + 42
15 UIKit 0x0000000111bfcf8d -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4818
16 UIKit 0x0000000111c030ed -[UIApplication _runWithMainScene:transitionContext:completion:] + 1731
17 UIKit 0x0000000111c0026d -[UIApplication workspaceDidEndTransaction:] + 188
18 FrontBoardServices 0x00000001164a56cb __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24
19 FrontBoardServices 0x00000001164a5544 -[FBSSerialQueue _performNext] + 189
20 FrontBoardServices 0x00000001164a58cd -[FBSSerialQueue _performNextFromRunLoopSource] + 45
21 CoreFoundation 0x0000000111072761 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
22 CoreFoundation 0x000000011105798c __CFRunLoopDoSources0 + 556
23 CoreFoundation 0x0000000111056e76 __CFRunLoopRun + 918
24 CoreFoundation 0x0000000111056884 CFRunLoopRunSpecific + 420
25 UIKit 0x0000000111bfeaea -[UIApplication _run] + 434
26 UIKit 0x0000000111c04c68 UIApplicationMain + 159
27 fireDataBaseTest 0x000000010f40409f main + 111
28 libdyld.dylib 0x0000000113d8a68d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException


I'm new to swift and firebase so I'm looking forward to get some help. The fix is probably very simple and I'm just missing something because of lack of skill.

Jay Jay
Answer Source

You already figured out the error but want to add a few things for guidance.

Your app delegate should look like this (Swift 3, Firebase 3). There are other options as well. This is just a starting point.

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        FIRApp.configure()
        return true
    }

The viewController should be

import UIKit
import Firebase

    class ViewController: UIViewController {

        var ref: FIRDatabaseReference!

and your viewDidLoad method

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    ref = FIRDatabase.database().reference()
}

Now, your interface functions:

@IBAction func sunnyPressed(_ sender: Any) {
    ref.child("condition").child("addedByUser").setValue("sunny")
}

Not sure you going to want to do that as it will write the following node to Firebase

rootRef
   condition
     addedByUser: "sunny"

you may want something like

rootRef
  conditions
    -Yu99sj9jkoe
       addedByUser: "users uid"
       condition: "snowing"
       timestamp: "20170205075600"
       location: "Mountains"

The -Yu99sj9jkoe is created with childByAutoId - and the rest is a dictionary written to that child node.

Oh - ensure you have imported your GoogleService-Info.plist file as well which is generated from the Firebase console.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download