2015-08-19 2 views
0

table view.reloadData() обновляет представление таблицы после того, как я меняю контроллер представления, и я возвращаюсь. Я добавляю функциональность для обновления:table view.reloadData() не работает в представлении таблицы

lazy var refreshControl: UIRefreshControl = { 
    let refreshControl = UIRefreshControl() 
    refreshControl.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged) 
    refreshControl.backgroundColor = UIColor.purpleColor() 
//  dispatch_async(dispatch_get_main_queue(), {() -> Void in 
//   self.tableView.reloadData() 
//  }) 
    return refreshControl 
    }() 

это вне любых методов. Тогда в viewdidload():

override func viewDidLoad() { 
     self.tableView.addSubview(self.refreshControl) 
} 

Функция handleRefresh заключается в следующем:

func handleRefresh(refreshControl: UIRefreshControl) { 
    // Do some reloading of data and update the table view's data source 
    // Fetch more objects from a web service, for example... 
    fetch() // Fetches new data 

    refreshControl.endRefreshing() 
    self.tableView.reloadData() 
} 

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

Это мой выборки код:

func fetch(){ 
    var query = PFQuery(className:"Photo") 
    query.whereKey("friend", equalTo:"bob") 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]?, error: NSError?) -> Void in 
     if error == nil { 
      // The find succeeded. 
      self.getImageData(objects as [PFObject]) 
      if let objects = objects as? [PFObject] { 
       PhotoInfoArray = objects // This is the global array that stores photo information, date created, etc. 
      } 
     } else { 
      println("Error: \(error!) \(error!.userInfo!)") 
     } 
    } 
} 

func getImageData(objects: [PFObject]) { 
    for object in objects { 

     let thumbNail = object["Image"] as PFFile 


     thumbNail.getDataInBackgroundWithBlock({ 
      (imageData: NSData!, error: NSError!) -> Void in 
      if (error == nil) { 
       let image = UIImage(data:imageData) 
       //image object implementation 
       imageArray.append(image!)// this is the global array that stores the actual pictures 
       //     println(image) 
      } 

     })//getDataInBackgroundWithBlock - end 
    }//for - end 
} 

Эти функции используют Синтаксический анализ в качестве внутреннего интерфейса.

+1

Ваш вызов выборки, скорее всего, ASync так, когда ваш код попадает reloadData данные не получил еще. Ваш текущий код зависит от синхронного выполнения. Таким образом, вы хотите выполнить вызов reloadData в обратном вызове (или делегировать метод) вашего запроса на выборку. Возможно, посмотрите на блоки, которые идеально подходят для такого рода вещей. – tafh

+0

uhhh Я подразумеваю закрытие конечно (блоки Objective-C;)) – tafh

+0

Спасибо, что ответили. Что означает «асинхронный»? –

ответ

0

Я думаю, что было бы неплохо отслеживать, что на самом деле находится в вашем массиве, потому что я никогда не видел сценарий, когда self.tableView.reloadData() не работает.
Я бы посоветовал напечатать массив в viewWillAppear или viewDidAppear.

Может быть, это может быть удобно, чтобы добавить вызов успеха тогда, если вам нужно ждать какой-то другой процесс, чтобы закончить так:

func someFunction(success: ((success: Bool) -> Void))) { 
     //Perform some tasks here 
     success(success: true) 
    } 

, а затем в ViewController ожидая результатов это будет выглядеть так:

someFunction({ (bool) -> Void in 
     if bool { 
      self.tableView.reloadData() 
     } 
    }) 
+0

Это правда, каждый учебник почти, похоже, использует reloadData() случайным образом, и он работает по-видимому. Я думаю, что, возможно, звонки не следуют за основным потоком, поэтому он ждет в фоновом режиме. –

0

tableView Имеет встроенную функциональность для его перезагрузки, при первом представлении отображаются первые 20 элементов, и, если вы используете таблицу прокрутки, а еще 20 элементов загружаются в таблицу, все методы снова вызываются. поэтому не нужно использовать обновление.

0

Ваш вызов выборки, скорее всего, асинхронный (так сделано в фоновом режиме), поэтому, когда ваш код попадает reloadData данные не получил еще. Ваш текущий код зависит от синхронного выполнения. Итак, вы хотите выполнить вызов reloadData в обратном вызове (или делегировать метод) вашего вызова извлечения. Возможно, посмотрите на закрытие, которое идеально подходит для такого рода вещей. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

Может быть, вы можете показать некоторые из кода кокетливой ..

+0

да, хорошая идея, я просто добавил. –

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

  • Нет связанных вопросов^_^