2016-09-01 3 views
0

Ich habe eine Hauptansicht, die eine Tabellenansicht mit einer Liste von Ländern ist. Wenn Sie auf einen beliebigen Ländernamen (Zelle) klicken, wird eine andere Ansicht über ein Segment geladen, das den Namen des Landes an den Navigationsleistentitel des nächsten View-Controllers übergibt.Ansicht wird nicht aktualisiert, bis das zweite Mal geladen

Das Problem ist auf den ersten Klick der Titel wird nicht aktualisiert, aber wenn ich auf Schaltfläche Zurück (die aktuelle Ansicht) klicken und klicken Sie auf einen anderen Ländernamen, lädt die zweite Ansicht erneut und zeigt den vorherigen Titel, der angenommen wurde beim ersten Versuch gezeigt werden.

Der Code für den ersten Haupt-View-Controller:

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    var sectionsArray = [String]() 
    var sectionsCountries = [Array<AnyObject>]() 

    @IBOutlet weak var countries: UITableView! 

    internal func numberOfSections(in tableView: UITableView) -> Int { 
     // Return the number of sections. 
     return self.sectionsArray.count 
    } 

    internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // Return the number of rows in the section. 
      return self.sectionsCountries[section].count 
    } 

    internal func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
     return self.sectionsArray[section] 
    } 

    internal func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "CountryCell", for: indexPath) 
     cell.textLabel?.text = self.sectionsCountries[indexPath.section][indexPath.row] as? String 
     return cell 
    } 

    var valueToPass:String! 

    internal func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     print("You selected cell #\(indexPath.row)!") 

     // Get Cell Label 
     let indexPath = tableView.indexPathForSelectedRow; 
     let currentCell = tableView.cellForRow(at: indexPath!) as UITableViewCell!; 

     valueToPass = currentCell?.textLabel?.text 
     performSegue(withIdentifier: "cellSegue", sender: self) 
     //print(valueToPass) 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "cellSegue" { 
      let destination = segue.destination as! CountryViewController 
      destination.passedValue = valueToPass 
     } 
    } 

    override func viewDidLoad() { 

     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     let url = URL(string: "http://cyber7.co.il/swift/countries/countries-list.json")! 
     let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
      if error != nil { 
       print(error) 
      } else { 
       if let urlContent = data { 
        do { 
         let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) 
         for result in jsonResult as! [Dictionary<String, AnyObject>]{ 
          self.sectionsArray.append(result["sectionName"] as! String) 
          self.sectionsCountries.append(result["sectionCountries"] as! Array<String> as [AnyObject]) 
         } 
        } catch { 
         print("JSON Processing Failed") 
        } 
        DispatchQueue.main.async(execute: {() -> Void in 
         self.countries.reloadData() 
        }) 
       } 
      } 
     } 
     task.resume() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

der Code für den zweiten View-Controller:

import UIKit 

class CountryViewController: UIViewController { 

    var passedValue:String! 

    @IBOutlet weak var navBar: UINavigationBar! 

    @IBAction func backButton(_ sender: AnyObject) { 
     self.dismiss(animated: true, completion: nil) 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     self.navBar.topItem?.title = passedValue 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

Antwort

0

Wenn Sie einen Übergang nach oben aus einer Tabellenansicht Zelle auf einen Blick festgelegt haben Controller im Storyboard wird dann automatisch ausgeführt, wenn eine Zelle ausgewählt wird. Ihr Aufruf zum Ausführen eines Abschnitts in Ihrer Zellenauswahlmethode führt den Übergang ein zweites Mal aus, nachdem der erste bereits ausgeführt wurde.

Ihre tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) Methode entfernen und alles tun, um die Daten Logik in prepareForSegue vorbei:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "cellSegue" { 
     let destination = segue.destination as! CountryViewController 
     let indexPath = countries.indexPathForSelectedRow 
     let currentCell = countries.cellForRow(at: indexPath!) 
     destination.passedValue = currentCell?.textLabel?.text 
    } 
} 
+0

Also, wie kann ich den Zugriff bekommen auf „Current .textLabel .text?“, Wenn nicht ein „didSelectRowAt“ verwenden? –

+0

Der Code, den ich in meine Antwort geschrieben habe, zeigt dir, wie man das macht ..? – dan

+0

Es funktioniert Dan, vielen Dank für Ihre Hilfe. –

Verwandte Themen