2015-10-28 5 views
0

Я совершенно новичок в этом. Я потратил несколько часов, чтобы обсудить различные вопросы по этой теме, но не смог найти ответ, который мне подходит.Как перезагрузить табличное представление с помощью контроллера вида (swift)

У меня есть viewcontroller (не tableviewcontroller) с представлением tableview как subview. Мой вопрос заключается в том, как перезагрузить данные таблицы внутри: viewwillappear метода контроллера вида. Внутри метода я не могу «получить доступ» к экземпляру tableview. (Также я понимаю, что я не могу использовать reloaddata(), потому что я не использовал tableviewcontroller).

Знаете ли вы какое-нибудь простое решение? (Я очень предположить, что протокол может помочь в этом?)

это код короче:

class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var Person_data = [Person]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let tb: UITableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain) 

     tb.dataSource = self 
     tb.delegate = self 
     super.view.addSubview(tb) 

     fetch_data() 
    } 


     func tableView(tableview: UITableView, numberOfRowsInSection section: Int) -> Int { 
      let rows = Person_data.count 
      return rows 
     } 


     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
     { 
      let cell: UITableViewCell = UITableViewCell() 
      cell.textLabel?.text = Person_data[indexPath.row].name 
      return cell 
     } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     fetch_data()  
     // reload at this point 

    } 


    func fetch_data() { 

     let tb_fetchRequest = NSFetchRequest(entityName: "Person") 
     do { 

      let tb_fetchResults = try my_moc.executeFetchRequest(tb_fetchRequest) as? [Person] 
      Person_data = tb_fetchResults! 
     } catch let error as NSError { 
       print("request error: \(error)") 
      } 

     } 
    } 

ответ

2

Ваша проблема заключается в том, что tb является локальной переменной, поэтому она не видна за пределами viewDidLoad().

Если вы tb свойство (он же переменный экземпляр) ваш контроллер представления, то вы можете использовать его с любого из методов контроллера:

class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var Person_data = [Person]() 

    private var tb: UITableView? // Now the scope of tb is all of ViewController3... 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // ...so it is visible here... 

     tb = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain) 

     ... 
    } 

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

     tb?.reloadData() // ...and it is also visible here. 
    } 

Обратите внимание, что в вашем коде, тот факт, что tb является локальная переменная не означает, что ваш объект UITableView исчезает, когда заканчивается viewDidLoad(). Это означает, что ваш ссылка на UITableView исчезает. Сам объект представления таблицы живет, потому что он добавлен в вашу иерархию представлений, но у вас больше нет ссылки на него, потому что ваша переменная выходит за рамки.

Для дальнейшего чтения о различии между переменными и объектами, на которые они ссылаются, поиск «рамки» и «пройти по ссылке.»

+0

Спасибо за подсказку. Я посмотрел более подробно на переменные экземпляра – Netzer

+0

Также обратите внимание на ответ @ Arsen, в котором показано, как можно предотвратить возможность того, что tableView не может быть необязательно инициализировать его немедленно. Этот метод часто не работает с элементами пользовательского интерфейса, но в этом случае он работает. –

0
class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    private let tableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain) 
    var Person_data = [Person]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.dataSource = self 
     tableView.delegate = self 
     super.view.addSubview(tb) 

     fetch_data() 
    } 



    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     fetch_data()  
     tableView.reloadData() 

    } 
    } 
1

Вы можете получить доступ к tableViewIBOutlet в viewWillAppear:, вы также можете позвонить reloadData. Я не уверен, почему вы думаете, что не можете, но это должно работать нормально.

1

Вы должны создать переменную с ссылкой на Tableview и создать его перед viewWillAppear.

class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    private let tableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain) 
    var Person_data = [Person]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.dataSource = self 
     tableView.delegate = self 
     super.view.addSubview(tb) 

     fetch_data() 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     fetch_data()  
     tableView.reloadData() 
    } 
}