UITableView не загружает данные изначально

Мой UITableViewController при первоначальном просмотре не содержит никаких данных. Однако однажды я перехожу к другому UIViewController, данные появляются, пока переход все еще анимируется, а затем данные есть. Итак, чтобы увидеть данные, мне нужно перейти к другому ViewController, а затем вернуться к UITableViewController. Я использую фреймворк Parse.com. Следующий код имеет начальный ViewController, который также является UITableViewController, который переходит в UITableViewController, который изначально не содержит никаких данных. Спасибо за помощь, я новичок в разработке IOS, поэтому, пожалуйста, отвечайте быстро.
РЕДАКТИРОВАТЬ: Многие ответы или комментарии предполагают, что данные извлекаются и просто не загружаются в UITableViewController. Однако проблема заключается в том, что данные не были получены к моменту завершения перехода. Спасибо

override func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObject?){
    var cell = sender as UITableViewCell
    var text = cell.textLabel!.text
    currentScreen=text!
    println(currentScreen)
    groupConversation=[]
    var messageDisplayOne = PFQuery(className:currentScreen)
    messageDisplayOne.selectKeys(["userPost"])
    messageDisplayOne.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil{
            println("Type message \(groupConversation)")
            for object in objects {
                var textObject = object["userPost"] as String
                groupConversation.append(textObject)

            }
        } else {
            // Log details of the failure

        }
    }
}

person StevenZ    schedule 02.01.2015    source источник
comment
попробуйте вызвать [tableview reloadData] в viewDidAppear.   -  person rakeshbs    schedule 02.01.2015
comment
@rakeshbs это будет выглядеть как tableview.reloadData в Swift?   -  person StevenZ    schedule 02.01.2015
comment
да. tableview.reloadData в быстром   -  person rakeshbs    schedule 02.01.2015
comment
@rakeshbs Я только что попробовал, но, к сожалению, у меня все еще та же проблема, потому что все данные не загружены к тому времени, когда появляется UITableViewController.   -  person StevenZ    schedule 02.01.2015
comment
у вас есть обратный звонок, когда все данные были загружены? добавить вызов перезагрузки, когда загрузка данных завершена.   -  person rakeshbs    schedule 02.01.2015
comment
@rakeshbs Не могли бы вы рассказать мне, как это сделать, я новичок в IOS. Спасибо   -  person StevenZ    schedule 02.01.2015
comment
Техника Ракешбс должна работать. Используйте tableview.reloadData в обратном вызове успеха вашего запроса. Так что это должно идти сразу после цикла for   -  person Patrick Bradshaw    schedule 02.01.2015
comment
как вы загружаете данные? это из бд? или скачал?   -  person rakeshbs    schedule 02.01.2015
comment
@rakeshbs Данные взяты с Parse.com, значит, из базы данных.   -  person StevenZ    schedule 02.01.2015
comment
@PatrickBradshaw код, который я опубликовал, взят из исходного контроллера представления, а не из того, который не загружает данные, поэтому я не думаю, что использование данных tableview.reload в обратном вызове успеха моего запроса будет работать.   -  person StevenZ    schedule 02.01.2015
comment
Ааа, не подумал об этом. На данный момент игнорируйте мой ответ, и я обновлю его через секунду.   -  person Patrick Bradshaw    schedule 02.01.2015


Ответы (2)


Вы переходите в UITableViewController?

override func prepareForSegue(segue: UIStoryboardSegue!, sender:AnyObject?){
    //Start Spinner
    var cell = sender as UITableViewCell
    var text = cell.textLabel!.text
    currentScreen=text!
    println(currentScreen)
    groupConversation=[]
    var messageDisplayOne = PFQuery(className:currentScreen)
    messageDisplayOne.selectKeys(["userPost"])
    messageDisplayOne.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
          //Stop Spinner
          if error == nil{
            println("Type message \(groupConversation)")
            for object in objects {
                var textObject = object["userPost"] as String
                groupConversation.append(textObject)

            }
            var tableViewController = segue.destinationViewController as UITableViewController
            tableViewController.tableView.reloadData()

        } else {
            // Log details of the failure

        }

    }
}
person rakeshbs    schedule 02.01.2015
comment
Да, я перехожу к UITableViewController. - person StevenZ; 02.01.2015
comment
Ну, я просто набирал это в свой ответ, ха-ха. Вы можете захватить контроллер табличного представления таким образом (через destinationViewController) и перезагрузить его оттуда. Единственная другая вещь, которую вам, возможно (не уверен), нужно будет сделать, это развернуть переход, что вы можете сделать, заменив переход: UIStoryboardSegue на переход: UIStoryboardSegue! в заголовке вашего метода - person Patrick Bradshaw; 02.01.2015
comment
В строке, содержащей tableViewController.tableView.reloadData, я получаю сообщение об ошибке, указывающее, что выражение разрешается в неиспользуемую функцию. - person StevenZ; 02.01.2015
comment
попробуйте добавить круглые скобки () в reloadData. Я не очень хорошо разбираюсь в быстроте (я использую Objective-C), но быстрый поиск сказал мне, что они необходимы, поскольку это метод, а не свойство - person Patrick Bradshaw; 02.01.2015
comment
@PatrickBradshaw Я не думаю, что проблема в том, что UITableViewController не обновляет данные, а в том, что проблема в том, что данные не были получены к моменту завершения перехода. Так может спиннер подойдёт? - person StevenZ; 02.01.2015
comment
вот почему мы перезагружаем данные после того, как данные были загружены внутри блока. - person rakeshbs; 02.01.2015
comment
да, я полностью пропустил () для функции. Перепутал с Руби. - person rakeshbs; 02.01.2015
comment
@rakeshbs ааа, хорошо. Я только что попробовал ваш ответ со скобками, и он отлично работает. Из любопытства, когда данных гораздо больше, не лучше ли использовать счетчик. - person StevenZ; 02.01.2015
comment
да. Хорошо использовать индикатор активности (spinner), обработка идет. Вы также можете использовать индикатор сетевой активности. например, ios-sdk.blogspot.in/2012/ 01/ - person rakeshbs; 02.01.2015
comment
@rakeshbs Как бы мне добиться использования спиннера, ведь это то, к чему я стремился изначально? - person StevenZ; 02.01.2015
comment
я добавил комментарии в местах, где нужно остановить и запустить счетчик в приведенном выше коде. - person rakeshbs; 02.01.2015
comment
@rakeshbs Я знаю, как сделать счетчик, но как мне узнать, когда данные загружаются из Parse? - person StevenZ; 02.01.2015
comment
Вы видели места, где я оставлял комментарии? Запустите счетчик и остановите счетчик. Загрузка данных начинается при вызове messageDisplayOne.findObjectsInBackgroundWithBlock. Он останавливается, когда вы входите в блок (в комментарии Stop Spinner) - person rakeshbs; 02.01.2015
comment
Не могли бы вы отметить как ответ, если это решило вашу первоначальную проблему. - person rakeshbs; 02.01.2015
comment
@rakeshbs Как мне сделать счетчик в UITableViewController, к которому он переходит? - person StevenZ; 02.01.2015
comment
для этого вам придется реструктурировать свой код, переместив код загрузчика в uitableviewcontroller. Или запустите счетчик на viewDidLoad и остановитесь вызовом функции в uitableviewcontroller. - person rakeshbs; 02.01.2015

Как сказал Ракешбс в комментариях, здесь происходит то, что ваш запрос выполняется в фоновом потоке. Это означает, что ваше представление загружается до того, как запрос вернется и выполнит свой обратный вызов (загрузка данных).

Чтобы учесть это, мы можем использовать tableview.reloadData в конце успешного обратного вызова, чтобы перезагрузить таблицу после обработки данных. Код ниже:

ПРИМЕЧАНИЕ. См. ответ Rakeshbs для получения более чистой версии. Единственное отличие здесь состоит в том, что я распаковал UIStoryboardSegue, поскольку известно, что в некоторых случаях он вызывает проблемы при развертывании при доступе к свойствам.

override func prepareForSegue(segue: UIStoryboardSegue!, sender:AnyObject?){
    var cell = sender as UITableViewCell
    var text = cell.textLabel!.text
    currentScreen=text!
    println(currentScreen)
    groupConversation=[]
    var messageDisplayOne = PFQuery(className:currentScreen)
    messageDisplayOne.selectKeys(["userPost"])
    messageDisplayOne.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil{
                println("Type message \(groupConversation)")
            for object in objects {
                var textObject = object["userPost"] as String
                groupConversation.append(textObject)

            }
            var destinationController = segue.destinationViewController as UITableViewController
            destinationController.tableView.reloadData()
        } else {
            // Log details of the failure

        }
    }
}
person Patrick Bradshaw    schedule 02.01.2015