2017-01-27 5 views
1

EDIT: Der Code funktioniert jetzt, stellt sich heraus, es war veraltete Daten. Ich habe das Projekt gespeichert und geputzt, den Simulator zurückgesetzt und jetzt funktioniert es! Danke @pbasdf für die Hilfe!Einstellung Core Data Wert von lokalisierten Strings

Ich gewöhne mich immer noch an die Kerndaten und lokalisierte Strings, also bin ich mir nicht sicher, ob ich lokalisierte Zeichenfolgen falsch verwende oder ob das Problem irgendwo anders ist, aber wenn ich auf die Zellen klicke, die ich sehen kann über meine print-Anweisung, dass alle Werte Null sind und offensichtlich keine Webseiten geladen sind.

ich eine localized.strings Datei bin mit einem Namen seiner entsprechenden URL zu:

"iPhone" = "http://www.apple.com/iphone/"; 
"iPad" = "http://www.apple.com/ipad/"; 
"Macbook" = "http://www.apple.com/macbook/"; 
"Google" = "https://www.google.com/"; 
"Firebase" = "https://firebase.google.com/"; 
"Magic Leap" = "https://www.magicleap.com/"; 
"Facebook" = "https://www.facebook.com/"; 
"Instagram" = "https://www.instagram.com/?hl=en"; 
"WhatsApp" = "https://www.whatsapp.com/"; 
"Model S" = "https://www.tesla.com/models"; 
"Model X" = "https://www.tesla.com/modelx"; 
"Powerwall" = "https://www.tesla.com/powerwall"; 
"Twitter" = "https://twitter.com/?lang=en"; 
"Periscope" = "https://www.periscope.tv/"; 
"Vine" = "https://vine.co/"; 

So kann ich das url Attribut (vom Typ String) meiner Product Einheit. Wörterbuch der Unternehmen und Produkte:

let defaultProducts = ["Apple" : ["iPhone", "iPad", "Macbook"], 
           "Google" : ["Google", "Firebase", "Magic Leap"], 
           "Facebook" : ["Facebook", "Instagram", "WhatsApp"], 
           "Tesla" : ["Model S", "Model X", "Powerwall"], 
           "Twitter" : ["Twitter", "Periscope", "Vine"]] 

Und hier ist der entsprechende Code aus meiner Funktion:

let companyProducts = defaultProducts[name] 

for productName in companyProducts! { 

    let product = NSManagedObject(entity: productEntity, insertInto:managedContext) 
    let names = NSLocalizedString(productName, comment:"") 

    product.setValue(productName, forKey: "name") 
    product.setValue(productName, forKey: "image") 
    product.setValue(names, forKey: "url") 

    product.setValue(company, forKey: "company") 
} 

Dann benutze ich es die Web-Seite angezeigt werden, wenn die Zelle abgegriffen

// WebView 
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    guard let appDelegate = 
     UIApplication.shared.delegate as? AppDelegate else { 
      return 
    } 

    let managedContext = 
     appDelegate.persistentContainer.viewContext 

    let entity = 
     NSEntityDescription.entity(forEntityName: "Product", 
            in: managedContext)! 

    let product = NSManagedObject(entity: entity, 
            insertInto: managedContext) 

    if let url = product.value(forKey: "url") as? URL { 
     webView.load(URLRequest(url: url)) 
     webView.allowsBackForwardNavigationGestures = true 
     view = webView 

    } 
    print(product.value(forKey: "url") as? URL) 
} 

Mache ich etwas falsch in localized.strings, was zu dem nil Wert führt?

EDIT: setDefaults() mit url Wörterbuch:

func setDefaults() { 
    let userDefaults = UserDefaults.standard 
    let defaultValues = ["firstRun" : true] 
    userDefaults.register(defaults: defaultValues) 

    if userDefaults.bool(forKey: "firstRun") { 
     let defaultProducts = ["Apple" : ["iPhone", "iPad", "Macbook"], 
           "Google" : ["Google", "Firebase", "Magic Leap"], 
           "Facebook" : ["Facebook", "Instagram", "WhatsApp"], 
           "Tesla" : ["Model S", "Model X", "Powerwall"], 
           "Twitter" : ["Twitter", "Periscope", "Vine"]] 

     let urlDictionary = ["iPhone" : "http://www.apple.com/iphone/", 
          "iPad" : "http://www.apple.com/ipad/", 
          "Macbook" : "http://www.apple.com/macbook/", 
          "Google" : "https://www.google.com/", 
          "Firebase" : "https://firebase.google.com/", 
          "Magic Leap" : "https://www.magicleap.com/", 
          "Facebook" : "https://www.facebook.com/", 
          "Instagram" : "https://www.instagram.com/?hl=en", 
          "WhatsApp" : "https://www.whatsapp.com/", 
          "Model S" : "https://www.tesla.com/models", 
          "Model X" : "https://www.tesla.com/modelx", 
          "Powerwall" : "https://www.tesla.com/powerwall", 
          "Twitter" : "https://twitter.com/?lang=en", 
          "Periscope" : "https://www.periscope.tv/", 
          "Vine" : "https://vine.co/"] 

     let companyEntity = NSEntityDescription.entity(forEntityName: "Company", in: managedContext)! 
     let productEntity = NSEntityDescription.entity(forEntityName: "Product", in: managedContext)! 

     // Setting the default company data (name, logo, and stockPrice) 
     let url = URL(string: "https://query.yahooapis.com/v1/public/yql?q=select%20symbol%2C%20Ask%2C%20YearHigh%2C%20YearLow%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AAPL%22%2C%22GOOG%22%2C%22TWTR%22%2C%22TSLA%22%2C%20%22FB%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys")! 
     let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
      if error != nil { 
       print(error!) 
      } else if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 { 
       let json = JSON(data: data!) 
       if let quotes = json["query"]["results"]["quote"].array { 
        for quote in quotes { 
         let symbol = quote["symbol"].stringValue 
         let name = NSLocalizedString(symbol, comment:"") 
         let ask = quote["Ask"].stringValue 
         let company = NSManagedObject(entity: companyEntity,insertInto: managedContext) 
         company.setValue(name, forKey: "name") 
         company.setValue(name, forKey: "logo") 
         company.setValue(ask, forKey: "stockPrice") 
         companies.append(company) 

         let companyProducts = defaultProducts[name] 

         for productName in companyProducts! { 

          let product = NSManagedObject(entity: productEntity, insertInto:managedContext) 
          let names = urlDictionary[productName] 

          product.setValue(productName, forKey: "name") 
          product.setValue(productName, forKey: "image") 
          product.setValue(names, forKey: "url") 

          product.setValue(company, forKey: "company") 

         } 
         print(json) 
        } 

        DispatchQueue.main.async { 
         do { 
          try managedContext.save() 
          vc.tableView.reloadData() 
          userDefaults.set(false, forKey: "firstRun") 
         } catch let error as NSError { 
          print("Could not save. \(error), \(error.userInfo)") 
         } 
        } 
       } 
      } else { 
       print("The data couldn't be loaded") 
      } 
     } 
     task.resume() 
    } 
} 
+0

In 'Tableview: didSelectRowAt:' Sie ein neues (leeres) Produkt zu schaffen und dann die entsprechende URL bekommen Attribut - das ist also Null. Sie müssen stattdessen das richtige Produkt für die angetippte Zeile nachschlagen: 'let product = products [indexPath.row]'. – pbasdf

+0

@pbasdf Das ist ein dummer Fehler, ich hätte bemerken sollen, was ich dort gemacht habe - ich habe es zu deinem Vorschlag geändert und ich sehe immer noch "Nil". Ich werde versuchen, den 'localized.strings'-Ansatz loszuwerden, da es anscheinend nicht der effizienteste Weg ist, dies zu tun, und vielleicht verursacht das das Problem? – d0xi45

+0

Wenn Sie 'print (product.value (forKey:" url "))', zeigt es Null oder die URL? – pbasdf

Antwort

1

Eine Reihe von Problemen zusammengesetzt wurden:

  1. Der didSelectRowAt Code wurde die Schaffung neuer Product Instanzen, anstatt mit dem richtigen Product auf der Grundlage der Reihe angezapft. Die Lösung für diesen ersetzen sollte:

    let product = NSManagedObject(entity: entity, insertInto: managedContext) 
    

    mit:

    let product = products[indexPath.row] 
    
  2. Der Code auch angenommen, dass das url Attribut der Product Einheit vom Typ war URL; in der Tat war es vom Typ String. Die Lösung für dieses war die Besetzung zu korrigieren, und dann eine URL vom String erstellen:

    if let urlString = product.value(forKey: "url") as? String { 
        let url = URL(string:urlString) 
    
  3. schließlich die NSLocalizedStrings Probleme verursacht wurden, wenn die Standarddaten zu schaffen. Das wurde behoben, indem sie mit einem Wörterbuch zu ersetzen:

    let urlDictionary = ["iPhone" : "http://www.apple.com/iphone/", 
            "iPad" : "http://www.apple.com/ipad/", etc 
    

    und dann:

    let names = urlDictionary[productName]