2017-01-27 2 views
1

EDIT: код теперь работает, оказывается, это устаревшие данные. Я сохранил и очистил проект, сбросил симулятор и теперь он работает! Спасибо @pbasdf за то, что помогли мне!Настройка значения основных данных из локализованных строк

Я по-прежнему привыкаю к ​​основным данным и локализованным строкам, поэтому не уверен, что я неправильно использую локализованные строки или если проблема находится где-то в другом месте, но когда я нажимаю на ячейки, я могу видеть через мой оператор печати, что все значения равны нулю, и, очевидно, веб-страницы не загружаются.

Я использую файл localized.strings приравнять имя в соответствующий URL:

"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/"; 

Так что я могу установить атрибут url (типа String) моего Product лица. Словарь компаний и продуктов:

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 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") 
} 

Затем я использую его для отображения веб-страницы, когда сливают клетка

// 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) 
} 

Я делаю что-то неправильно в localized.strings, в результате чего значение nil?

EDIT: setDefaults() с URL-адрес словаря:

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

В 'Tableview: didSelectRowAt:' вы создаете новый (пустой) продукт, а затем получить его URL атрибут - поэтому nil. Вам нужно вместо этого найти правильный продукт для строки, которая была использована: 'let product = products [indexPath.row]'. – pbasdf

+0

@pbasdf Это глупая ошибка, я должен был заметить, что я там делаю - я изменил ее на ваше предложение, и я все еще вижу «ноль». Я попытаюсь избавиться от подхода 'localized.strings', поскольку, по-видимому, это не самый эффективный способ сделать это, и, возможно, это вызывает проблему? – d0xi45

+0

Если вы напечатаете (product.value (forKey: "url")) ', показывает ли оно nil или url? – pbasdf

ответ

1

усугубились ряд проблем:

  1. didSelectRowAt код создавал новые Product экземпляры, а не с помощью правильного Product на основе строка нажата. Чтобы исправить это было заменить:

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

    с:

    let product = products[indexPath.row] 
    
  2. код также предполагается, что атрибут Product сущности url был типа URL; на самом деле он был типа String. Чтобы исправить это было исправить бросок, а затем создать URL из String:

    if let urlString = product.value(forKey: "url") as? String { 
        let url = URL(string:urlString) 
    
  3. Наконец, NSLocalizedStrings вызывали проблемы при создании данных по умолчанию. Это было зафиксировано, заменив их со словарем:

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

    , а затем:

    let names = urlDictionary[productName] 
    
Смежные вопросы