, поэтому у нас есть приложение, в котором пользователь выбирает изображение, и на следующем экране (контроллер представления результатов) изображение переводится в текст, и этот текст отображается в метке, и есть другая метка, которая преобразует этот текст вдругой язык. поэтому я пытался сохранить данные из этих двух меток на другом экране, который называется контроллером представления истории, поэтому, если пользователь выбирает другое изображение и хочет видеть преобразованный текст этого изображения. поэтому позже он может увидеть список всего преобразованного текста и переведенного текста на одной странице, попробовав мою логику, но, похоже, не работает и выдает неразрешенные ошибки, если кто-то может разобраться в этом и увидеть, что я делаю неправильно, это было бы действительнополезно Просто чтобы прояснить новое в swift, только начал изучать.
КОНТРОЛЛЕР ПРОСМОТРА ВИДА
import UIKit
class ResultsViewController: UIViewController {
var imageResult: String?
var translatedText = ""
let jsonEncoder = JSONEncoder()
let translateURL = "https://unitec-assignment3-translation.cognitiveservices.azure.com/sts/v1.0/issuetoken"
let translateKey = "7c0cc4fccb60499e8c4e767bdcf94539"
let datafile = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("resultsHistory.plist")
let encoder = PropertyListEncoder()
let decoder = PropertyListDecoder()
@IBOutlet weak var translationLabel: UILabel!
@IBOutlet weak var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
print(datafile)
translate(toTranslate: imageResult ?? "error occured")
self.resultLabel.text = imageResult
// below line was not updating label move this to within the translate function instead for it to work
//self.translationLabel.text = translatedText
// Do any additional setup after loading the view.
}
@IBAction func returnPressed(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
func translate(toTranslate: String){
let fromLangCode = "en"
let toLangCode = "de"
// print("this is the selected language code ->", arrayLangInfo[fromLangCode].code)
// let selectedFromLangCode = arrayLangInfo[fromLangCode].code
//let selectedToLangCode = arrayLangInfo[toLangCode].code
struct encodeText: Codable {
var text = String()
}
let azureKey = "7c0cc4fccb60499e8c4e767bdcf94539"
let contentType = "application/json"
let traceID = "A14C9DB9-0DED-48D7-8BBE-C517A1A8DBB0"
let host = "dev.microsofttranslator.com"
let apiURL = "https://dev.microsofttranslator.com/translate?api-version=3.0&from=" + fromLangCode + "&to=" + toLangCode
let text2Translate = toTranslate
var encodeTextSingle = encodeText()
var toTranslate = [encodeText]()
encodeTextSingle.text = text2Translate
toTranslate.append(encodeTextSingle)
let jsonToTranslate = try? jsonEncoder.encode(toTranslate)
let url = URL(string: apiURL)
var request = URLRequest(url: url!)
request.httpMethod = "POST"
request.addValue(azureKey, forHTTPHeaderField: "Ocp-Apim-Subscription-Key")
request.addValue(contentType, forHTTPHeaderField: "Content-Type")
request.addValue(traceID, forHTTPHeaderField: "X-ClientTraceID")
request.addValue(host, forHTTPHeaderField: "Host")
request.addValue(String(describing: jsonToTranslate?.count), forHTTPHeaderField: "Content-Length")
request.httpBody = jsonToTranslate
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let task = session.dataTask(with: request) { (responseData, response, responseError) in
if responseError != nil {
print("this is the error ", responseError!)
let alert = UIAlertController(title: "Could not connect to service", message: "Please check your network connection and try again", preferredStyle: .actionSheet)
alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
self.present(alert, animated: true)
}
print("*****")
self.parseJson(jsonData: responseData!)
}
task.resume()
}
func parseJson(jsonData: Data) {
//*****TRANSLATION RETURNED DATA*****
struct ReturnedJson: Codable {
var translations: [TranslatedStrings]
}
struct TranslatedStrings: Codable {
var text: String
var to: String
}
let jsonDecoder = JSONDecoder()
let langTranslations = try? jsonDecoder.decode(Array<ReturnedJson>.self, from: jsonData)
let numberOfTranslations = langTranslations!.count - 1
print(langTranslations!.count)
//Put response on main thread to update UI
DispatchQueue.main.async {
print(self.translatedText)
self.translatedText = langTranslations![0].translations[numberOfTranslations].text
print(self.translatedText)
self.translationLabel.text = self.translatedText
self.storeToHistory(origResult: self.imageResult ?? " error", TransResult: self.translatedText ?? "error translate" )
}
}
// function to store the results of image description and the translation description to an array at suitable place to allow access across files, currently this is in hisoryVC if too hard to store access then consider moving to app delegate to see if works better.
func storeToHistory(origResult: String, TransResult: String){
//passs in the two strings
var resultItem = ResultItem(rD: origResult, tD: TransResult)
do {
let data = try encoder.encode(resultItem)
try data.write(to: self.datafile!)
}catch {
print("error encoding item ")
}
}
struct ResultItem: Encodable, Decodable {
var resultDescription: String?
var translationDescription: String?
//later can add a thumbnail here if find solution
init( rD: String, tD: String) {
resultDescription = rD
translationDescription = tD
}
}
КОНТРОЛЛЕР ПРОСМОТРА ИСТОРИИ
import UIKit
class HistoryViewController: UIViewController {
var searchHistory: [ResultItem]? = [ResultItem(rD: "test 1 result", tD: "test 1 translation"),
ResultItem(rD: "test 2 result", tD: "test 2 translation"),
ResultItem(rD: "test 3 result", tD: "test 3 translation"),
ResultItem(rD: "test 4 result", tD: "test 4 translation")] // test array, remove/ comment out before = once code auto updates history
@IBOutlet weak var historyResult: UITableView!
@IBAction func returnToMain(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
// load items from the searchHistory array into the UI table.
//history
// Do any additional setup after loading the view.
}
struct ResultItem {
var resultDescription: String?
var translationDescription: String?
//later can add a thumbnail here if find solution
init( rD: String, tD: String) {
resultDescription = rD
translationDescription = tD
}
}
}