2017-01-28 1 views
0

Обновление: Мой вызов let vc = viewControllers(for: self) возвращал неправильные значения, поэтому обновление не запускалось.UITableView не обновляется после вызова таблицыView.reloadData в главном потоке

Я пытаюсь обновить UITableView с помощью метода tableView.reloadData, но это не вызывает обновление?

Обновление должно произойти, когда selectAndHighlight вызывается из контроллера родительского вида, когда результат поиска щелкнул

Ive искали вокруг, и от того, что я могу сказать, что мне нужно, чтобы вызвать обновление на главном потоке, так Я сделал это, но я все еще не получаю никаких обновлений?

В долгосрочной перспективе я, вероятно, хочу только обновить одну ячейку, но на данный момент я просто хочу, чтобы что-то обновлялось, что не работает. В моей команде печати во время перезагрузки нет вывода журнала.

Когда я прокручиваю содержимое с экрана, а затем снова включаю, новый контент там правильно, поэтому данные синхронизируются правильно, это просто не обновляется.

import UIKit 
import RealmSwift 
import XLPagerTabStrip 

class ArtistViewControllerTableViewController: UITableViewController, IndicatorInfoProvider { 

open var stageName = "" 

var artists: Results<Artist>! 

override func viewDidLoad() { 

    let realm = try! Realm() 

    artists = try! realm.objects(Artist.self).filter("stageName = '" + stageName + "'") 

    super.viewDidLoad() 
} 


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

    let cell = tableView.dequeueReusableCell(withIdentifier: "ArtistCell", for: indexPath) 
    as! ArtistCellTableViewCell 

    let artist = artists[indexPath.row] as Artist 

    cell.artist = artist 

    print ("updating " + artist.artistName) 

    return cell 
} 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    print("Artist Clicked") 
} 

open func selectAndHighlight(artist: Artist) { 

    print (stageName) 

    DispatchQueue.main.async { 

     let realm = try! Realm() 

     try! realm.write { 
      artist.artistName = "new name" 
     } 

     self.tableView.reloadData() 

    } 
} 

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

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

func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { 
    return IndicatorInfo(title: stageName) 
} 

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

Расширение, которое заканчивается вызовом метода SelectAndHighlight после нажатия на результат поиска.

extension ParentViewController: HandleSearchResultClick{ 
func select(artist: Artist) { 
    print(artist.artistName + " clicked") 
    var x = 0 

    let vc = viewControllers(for: self) 
    let table = vc[x] as? ArtistViewControllerTableViewController 
    table?.selectAndHighlight(artist: artist)  
} 
} 
+0

где вы назвали selectAndHighlight? –

+0

В контроллере родительского представления, который управляет всеми вкладками. Это протокол, и этот протокол работает. Триггеры print (stageName) и правильная печать. Я обновил сообщение, чтобы упомянуть протокол – Ben987654

+0

Извините, что это не протокол. Просто я получаю ссылку на контроллер вида, когда нажимают на результат поиска. let table = vc [x] as? ArtistViewControllerTableViewController стол .selectAndHighlight? (Исполнитель: художник) – Ben987654

ответ

0

Try вызова следующих FUNC перед вызовом tableView.reloadData()

func refreshArtistsObj(){ 
    let realm = try! Realm() 
    artists = try! realm.objects(Artist.self).filter("stageName = '" + stageName + "'") 
} 

Проблема после добавления ценности RealmDB вам нужно получить обновленное значение и обновить ваши художники объект снова.

+0

Это не работает. Данные обновляются нормально, если я не вызываю обновление в список областей, это табличное представление, которое не вызывает «tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell» после вызова reloadData – Ben987654