2017-02-11 12 views
0

私が取り組んでいるプロジェクトのテーブルビューに正しく表示されるユーザー入力値に苦労しています。コアデータ(?)にユーザー入力値が保存されていますが、テーブルビューには表示されません

私は、ユーザーが入力した値を取得する方法は、その後、テキストフィールドへの情報(会社名、銘柄記号、およびロゴのURL)を入力するようユーザーを取得行って、ボタンが押されたとき handleSave()を呼び出すことによってである

func handleSave() { 

let newCompanyName = nameTextField.text 
guard let newCompanyStockSymbol = stockTextField.text else { 
    // handle the error how you see fit 
    print("error getting text from field") 
    return 
} 
let newCompanyLogo = logoTextField.text 

var newCompanyStockPrice = "" 

// Fetch stock price from symbol provided by user for new company 
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(%22\(newCompanyStockSymbol)%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 ask = quote["Ask"].stringValue 
       newCompanyStockPrice = ask 
      } 
     } 
    } 
    self.viewController?.save(name: newCompanyName!, logo: newCompanyLogo!, stockPrice: newCompanyStockPrice) 
    //self.viewController?.tableView.reloadData() 
} 
task.resume() 



let cc = UINavigationController() 
let companyController = CompanyController() 
cc.viewControllers = [companyController] 
present(cc, animated: true, completion: nil) 
} 

これは、このsave関数を呼び出して、値を管理コンテキストに保存します。

func save(name: String, logo: String, stockPrice: String) { 

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

let managedContext = 
    appDelegate.persistentContainer.viewContext 

let entity = 
    NSEntityDescription.entity(forEntityName: "Company", 
           in: managedContext)! 
let company = NSManagedObject(entity: entity, 
           insertInto: managedContext) 


company.setValue(stockPrice, forKey: "stockPrice") 
company.setValue(name, forKey: "name") 
company.setValue(logo, forKey: "logo") 


do { 
    try managedContext.save() 
    companies.append(company) 
} catch let error as NSError { 
    print("Could not save. \(error), \(error.userInfo)") 
} 

tableView.reloadData() 
} 

私は私のhandleSave()機能でself.viewController?.save(name: newCompanyName!, logo: newCompanyLogo!, stockPrice: newCompanyStockPrice)を呼び出すとき、私はブレークポイントを置けば、私はすべての3つのもの(newCompanyNamenewCompanyLogo、およびnewCompanyStockPrice)が値を持っていることがわかります。私はcellForRowでそれを設定しようとする。しかし、新会社は、私のテーブルビューに表示されない:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return companies.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! Cell 
    let company = companies[indexPath.row] 
    let stock = company.value(forKey: "stockPrice") as? String 

    // Company name labels 
    cell.textLabel?.text = company.value(forKey: "name") as? String 


    // Stock price underneath 
    if let stock = stock { 
     cell.detailTextLabel?.text = "Current stock price: \(stock)" 
    } 

    // Logos 
    DispatchQueue.main.async { 
    if let url = NSURL(string: (company.value(forKey: "logo") as? String)!) { 
     if let data = NSData(contentsOf: url as URL) { 
      cell.logoView.image = UIImage(data: data as Data) 
     } else { 
      cell.logoView.image = UIImage(named: "noImage") 
     } 
    } 
    } 
    return cell 
} 

はEDIT:viewWillAppear

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

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

    let managedContext = 
     appDelegate.persistentContainer.viewContext 

    //2 
    let fetchRequest = 
     NSFetchRequest<NSManagedObject>(entityName: "Company") 

    //3 
    do { 
     companies = try managedContext.fetch(fetchRequest) 
    } catch let error as NSError { 
     print("Could not fetch. \(error), \(error.userInfo)") 
    } 

} 
+0

? –

+0

@SahebRoy申し訳ありません、私はちょうど私の投稿の下に 'viewWillAppear'を追加しました – d0xi45

+0

あなたがストーリーボードを使用している場合は、デフォルトのイニシャライザ'() 'でビューコントローラを作成しないでください。彼らはまったく新しいインスタンスであり、確かにストーリーボードの予想されるオブジェクトではありません。 – vadian

答えて

0

私がメインで、明示的にデータを再ロードするために電話をかけ助言しますキュー。 dataTask補完ハンドラ内からfunc save(name: String, logo: String, stockPrice: String)を呼び出すと、そのスレッドのreloadDataが呼び出されているようです。

したがって、save関数内で、このようにそれをラップ:

コアデータからデータをロードするためのコードがある
DispatchQueue.main.async { [weak self] in 
    self?.tableView.reloadData() 
} 
+0

私はそれを打ったが、テーブルビューはまだ新しい会社を表示しません – d0xi45

関連する問題