Apple iOS5 и didFinishLaunchingWithOptions

#objective-c #uitableview #ios4 #ios5 #uiapplicationdelegate

#objective-c #uitableview #ios4 #ios5 #uiapplicationdelegate

Вопрос:

У меня есть приложение для iPhone, которое используется UITableViewController для отображения таблицы на экране. Данные таблицы (и другие данные, используемые приложением) инициализируются в: didFinishLaunchingWithOptions: метод моего делегата приложения. Приложение отлично работает на iOS4. В iOS5 данные таблицы не загружаются. Я проверил и обнаружил, что didFinishLaunchingWithOptions: метод теперь вызывается параллельно с отображением представления. По этой причине при получении размера таблицы я перехожу к своему делегату приложения, который все еще не загрузил данные таблицы и поэтому возвращает «0».

Есть ли способ решить эту проблему в iOS 5?

Вот метод, который вызывается первым на мой взгляд:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    PalmsterAppDelegate *appDelegate = (PalmsterAppDelegate *)[[UIApplication sharedApplication] delegate];
    NSLog(@"tableView: %i", [appDelegate.listOfItems count]);
    return [appDelegate.listOfItems count];
}
  

вызов: [appDelegate.listOfItems count] возвращает ноль. И это ясно показывает, что порядок вещей таков:

didFinishLaunchingWithOptions вызывается (я печатаю в журнал при запуске метода). Затем tableView вызывается и выводит ноль. Затем didFinishLaunchingWithOptions завершается (я также печатаю в журнале в конце метода).

Комментарии:

1. Не могли бы вы показать код из вашего didFinishLaunchingWithOptions и код, относящийся к загрузке вашей таблицы, пожалуйста?

2. Что значит «вызывается параллельно»? didFinishLaunchingWithOptions: выполняется в основном потоке, как и все, что связано с UIKit (например, представления и контроллеры представлений), поэтому они не могут выполняться параллельно.

3. Когда я делаю NSLOG на: didFinishLaunchingWithOptions и в: — (NSInteger)TableView:(UITableView *)TableView numberOfRowsInSection:(NSInteger)раздел { AppDelegate * AppDelegate = (AppDelegate *)[[UIApplication sharedApplication] делегат]; NSLog(@»TableView: %i», [ Количество элементов AppDelegate.listOfItems]); return [AppDelegate.listOfItems count]; } Вот что я получаю: 1) didFinishLaunchingWithOptions:start, 2) TableView: 0, 3) didFinishLaunchingWithOptions:end

Ответ №1:

Переместите код инициализации в отдельный метод в делегате вашего приложения, а затем вызовите этот метод из -viewDidLoad метода вашего контроллера табличного представления.

Убедитесь, что вы инициализируете только один раз, независимо от того, сколько раз вызывается ваш метод инициализации.

Комментарии:

1. Хорошее предложение. Я уже пробовал это 🙂 Он показал мне пустой белый экран…

2. Странно. Это должно работать в большинстве ситуаций. Я должен был бы предположить, что в вашем методе инициализации есть что-то, что вы делаете асинхронно …? Я бы установил точку останова в вашем методе viewDidLoad и выполнил ее… посмотрите, что происходит с вашими NSLogs в связи с вашей инициализацией… попробуйте выяснить, почему numberOfRowsInSection вызывается до завершения инициализации… находится ли ваш UITableViewController в вашем MainWindow.xib?

3. Да, это проект UITableViewController. Я ничего не делаю асинхронно в AppDelegate. Инициализируйте массивы приложений только данными.

4. Используете ли вы Core Data? Я в недоумении.

5. Я не использую Core Data. На самом деле это первый раз, о котором я слышу. Я использую просто массивы и NSArrays для хранения моей информации.