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()
}
}
В 'Tableview: didSelectRowAt:' вы создаете новый (пустой) продукт, а затем получить его URL атрибут - поэтому nil. Вам нужно вместо этого найти правильный продукт для строки, которая была использована: 'let product = products [indexPath.row]'. – pbasdf
@pbasdf Это глупая ошибка, я должен был заметить, что я там делаю - я изменил ее на ваше предложение, и я все еще вижу «ноль». Я попытаюсь избавиться от подхода 'localized.strings', поскольку, по-видимому, это не самый эффективный способ сделать это, и, возможно, это вызывает проблему? – d0xi45
Если вы напечатаете (product.value (forKey: "url")) ', показывает ли оно nil или url? – pbasdf