2016-06-09 2 views
0

Sup guys? Нужна помощь здесь. Я использовал протокол делегата, чтобы передать некоторые строки обратно с «второго контроллера представлений» на предыдущий.Tableview не reloadData()

Мой массив добавляет строку из метода, который я реализовал по протоколу делегата, но каждый раз, когда я нажимаю «добавить» и возвращаюсь к первому экрану, представление таблицы не изменяется. Я не уверен, что строка не передается между представлениями, или это просто просмотр таблицы, который не перезагружается.

Код довольно прост:

import UIKit 

class EsseVaiReceber: UIViewController, UITableViewDataSource, UITableViewDelegate, PassInfoDelegate { 

    @IBOutlet var listaDeCoisasAFazer: UITableView! 
    var arrayInfo : [String] = [] 
    var stringReceived: String = "" 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     listaDeCoisasAFazer.reloadData() 
     print("SCREEN APPEARED") 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     listaDeCoisasAFazer.reloadData() 
     print("LOADED SCREEN") 
    } 

    func passInfo(infothatwillpass: String) { 
     arrayInfo.append(infothatwillpass) 
    } 


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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell! 
     let row = indexPath.row 
     let titulo = arrayInfo[row] 
     cell.textLabel!.text = titulo 

     return cell 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if(segue.identifier == "add") { 
      let view = segue.destinationViewController as! EsseVaiPassar 
       view.delegate = self 
     } 
    } 

} 

и:

import Foundation 
import UIKit 

protocol PassInfoDelegate { 
    func passInfo(infothatwillpass: String) 

} 

class EsseVaiPassar: UIViewController { 

    @IBOutlet var campoTitulo: UITextField! 
    var delegate: PassInfoDelegate? 
    var textinput: String = "" 


    @IBAction func botaoAdicionarCoisasAFazer(sender: AnyObject) { 

     if campoTitulo == nil { return } 
     textinput = campoTitulo!.text! 
     print("TEXTO NO CAMPO:\(textinput)") 

     if delegate == nil { 
      print("DELEGATE IS NILL") 
      return 
    } 

     delegate!.passInfo(textinput) 
     print("TEXTO DO DELEGATE: \(textinput)") 

     if let navigation = self.navigationController { 
      navigation.popViewControllerAnimated(true) 
      print("INFO QUE VAI PASSAR: \(textinput)") 
     } 
    } 
} 

Любые идеи, почему вид таблицы не будет заполнять? Спасибо advanced =)

+0

Я вижу, что у вас много журналов в приложении. Можете ли вы предоставить результат своего исключения? – piyuj

+0

Когда я запускаю приложение, вывод: «НАГРУЖЕННЫЙ ЭКРАН» и «ЭКРАНА ПОЯВЛЯЕТСЯ». Когда я нажимаю кнопку «Добавить», выход: «TEXTO DO CAMPO: BLABLABLA», «TEXTO DO DELEGATE: BLABLABLA», «INFO QUE VAI PASSAR: BLABLABLA» и «SCREEN APPEARED». –

+0

Я очень смущен смешением делегатов с таблицами. –

ответ

1

ТаблицаView использует arrayInfo как источник для данных таблицы listaDeCoisasAFazer (косвенно). Если вы измените arrayInfo, вам необходимо сообщить listaDeCoisasAFazer на номер reloadData().

func passInfo(infothatwillpass: String) { 
    arrayInfo.append(infothatwillpass) 
} 

Вы можете/должны удалить reloadData() из viewWillLoad и viewDidLoad как DataSource не изменился, поэтому нет необходимости повторной загрузки данных.

TIP

Вы проверки nil перед delegate вызова в пункте назначения ViewController. Если вы не выполняете это для целей отладки, вы можете просто позвонить delegate?.passInfo(textinput). Если делегат равен нулю, он просто игнорирует вызов.

Смежные вопросы