2016-03-30 7 views
0

У меня есть UITableViewController с UITableView (конечно), и мой вопрос заключается в том, как обновлять данные в tableView во время выполнения?tableView reloadData cellForRowAtIndexPath не называется

Потому что, когда я вызываю reloadData в viewWillAppear, он отлично работает, но позже в коде ничего не делает.

Количество строк метод вызывается и возвращает ненулевое число, но cellForRowAtIndexPath не называется так таблица не обновляется ...

class CropTableViewController: UITableViewController { 

var photos = [Photo]() 

var photoAssets = [PHAsset]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.automaticallyAdjustsScrollViewInsets = false 
} 

override func viewWillAppear(animated: Bool) { 
    refreshData() 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    print("rows called: \(photos.count)") // prints non-zero 
    return photos.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    print("cell called") 

    let cellIdentifier = "Cell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CropTableViewCell 

    let photo = photos[indexPath.row] 


    cell.photoImageView.image = photo.photo 

    return cell 
} 

func refreshData(){ 
    if (loadPhotos() != nil){ 
     photos = loadPhotos()! 
     tableView.reloadData() 
    } 

    print("refreshData called \(photos.count)") 
} 
} 

EDIT:

loadPhotos просто загрузки изображений с айфона память:

func loadPhotos() -> [Photo]? { 
    return NSKeyedUnarchiver.unarchiveObjectWithFile(Photo.ArchiveURL.path!) as? [Photo] 
} 

RefreshData вызывается из другого класса в этом цикле:

for asset in photoAssets { 
     let manager: PHImageManager = PHImageManager.defaultManager() 
     let scale: CGFloat = UIScreen.mainScreen().scale 
     let targetSize: CGSize = CGSizeMake(300.0 * scale, 180.0 * scale) 

     manager.requestImageForAsset(asset, targetSize: targetSize, contentMode: .AspectFill, options: self.requestOptions, resultHandler: {(image, info) -> Void in 
      let photo = Photo(photo: image!) 
      self.photos.append(photo!) 
      print("photos count \(self.photos.count)") 
      self.savePhotos() 
      CropTableViewController().refreshData() 
     }) 
    } 
+0

http://stackoverflow.com/questions/7712325/cellforrowatindexpath-not-called – hasan83

+0

Что делает 'loadPhotos'do? Это асинхронно? Ваш код в 'refreshData' должен получить значение' loadPhotos() 'и проверить, что для non-nil вместо вызова функции дважды. Можете ли вы показать, как вы вызываете 'refreshData' позже в коде? – Paulw11

+0

Я отредактировал вопрос. –

ответ

0

Выстрел в темноте. Попробуйте это:

func refreshData(){ 
    if let photos = loadPhotos() { 
     dispatch_async(dispatch_get_main_queue()) 
     { 
      photos = photos 
      tableView.reloadData() 
     } 
    } 

    print("refreshData called \(photos.count)") 
} 
Смежные вопросы