2015-12-12 4 views
0

У меня есть tableView в качестве начального контроллера и несколько меток в secondViewController. Когда я создаю ячейку с данными, которые мне нужны, идея состоит в том, чтобы отображать эти данные в метках второгоViewController. Все работает отлично, НО, метки в обновлении secondVC только тогда, когда я нажимаю кнопку «Назад», возвращаются к представлению таблицы и снова выбирают строку. Как я могу обновить данные, отображаемые во втором VC при первом касании в ячейке tableview?Обновление меток на secondViewController с данными из таблицыViewController

enter code here 

класс ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var tableView: UITableView! 

var titles = [String]() 
var subjects = [String]() 
var previews = [String]() 
var textFieldsText = [UITextField!]() 

var selectedTitle: String! 
var selectedSubject: String! 
var selectedPreview: String! 


override func viewDidLoad() { 
    super.viewDidLoad() 


    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "addTitle") 


} 

override func viewDidAppear(animated: Bool) { 
    tableView.reloadData() 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) 
    cell.textLabel?.text = titles[indexPath.row] 
    cell.detailTextLabel?.text = subjects[indexPath.row] 

    return cell 
} 

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

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    selectedTitle = self.titles[indexPath.row] 
    selectedSubject = self.subjects[indexPath.row] 
    selectedPreview = self.previews[indexPath.row] 
    tableView.reloadData() 

} 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showPreview" { 
     let dataToPass = segue.destinationViewController as! previewViewController 
     dataToPass.titlesString = selectedTitle 
     dataToPass.subjectsString = selectedSubject 
     dataToPass.previewsString = selectedPreview 

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

func addTitle() { 
    let addAlert = UIAlertController(title: "New Title", message: "Add new title, subject and a short preview", preferredStyle: .Alert) 

     addAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) 

     addAlert.addTextFieldWithConfigurationHandler {[unowned self] textField in 
      textField.placeholder = "Add Title" 
      textField.textAlignment = .Center 
      self.textFieldsText.append(textField) 
      } 
     addAlert.addTextFieldWithConfigurationHandler { textField in 
      textField.placeholder = "Add Subject" 
      textField.textAlignment = .Center 
      self.textFieldsText.append(textField) 
      } 
     addAlert.addTextFieldWithConfigurationHandler { textField in 
      textField.placeholder = "Add Short Preview" 
      textField.textAlignment = .Center 
      self.textFieldsText.append(textField) 
      } 
     addAlert.addAction(UIAlertAction(title: "Done", style: .Default){ _ in 
      self.titles.append(self.textFieldsText[0].text!) 
      self.subjects.append(self.textFieldsText[1].text!) 
      self.previews.append(self.textFieldsText[2].text!) 
      self.tableView.reloadData() 
      self.textFieldsText.removeAll() 
      }) 



    presentViewController(addAlert, animated: true, completion: nil) 

} 

}

class previewViewController: UIViewController { 
@IBAction func readButton(sender: UIButton) { 
} 
@IBOutlet weak var titleLabel: UILabel! 
@IBOutlet weak var subjectLabel: UILabel! 
@IBOutlet weak var shortPreviewLabel: UITextView! 

var titlesString: String! 
var subjectsString: String! 
var previewsString: String! 



override func viewDidLoad() { 
    super.viewDidLoad() 
    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Save, target: self, action: "saveChanges") 

    titleLabel.text = titlesString 
    subjectLabel.text = subjectsString 
    shortPreviewLabel.text = previewsString 

} 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDetail" { 

     let dataToDetail = segue.destinationViewController as! detailViewController 
     dataToDetail.textViewString = self.previewsString 

    } 
} 

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

firrst положить какой-нибудь код. Вы имеете в виду кнопку назад второго vC? –

+0

Пожалуйста, добавьте ваш код. –

+0

Я добавил код, спасибо –

ответ

0

Если я правильно понял ваш вопрос правильно, это может помочь:

использование этого didSelectRowAtIndexPath:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    performSegueWithIdentifier("showPreview", sender: indexPath.row) 
} 

использование этого prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showPreview" { 
     let destinationViewController = segue.destinationViewController as! previewViewController 
     if let index = sender as? Int { 
      destinationViewController.titlesString = self.titles[index] 
      destinationViewController.subjectsString = self.subjects[index] 
      destinationViewController.previewsString = self.previews[index] 
     } 
    } 
} 

И вы должны иметь SEGUE от ViewController к previewViewController под названием "showPreview". Пример:

segue instruction

+0

Это полуработало, теперь отображаются данные, но у меня есть два segues-анимации, сначала пустой, и один с данными, следующими за первым в последовательности. Раньше у меня была эта проблема, поэтому код выглядит так, как сейчас. Im, предполагающий, что prepareForSegue автоматически отображает пустое segue, за которым следует обновленный segue из файла didSelectRowAtIndexPath. –

+0

У вас должен быть только один сеанс в вашем раскадровке под названием «showPreview». Удалите те, которые у вас есть, и повторите попытку. Используйте segue непосредственно из контроллера просмотра на другой контроллер представления, см. Скриншот, который я добавил ... – Wiingaard

+0

Большое спасибо Rapsefar, который сработал. Просто любопытно, у меня только когда-то было одно шоу «showPreview». Почему он не работал с тем, что у меня было, что было таким же, как тот, который я заменил? –