#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 для хранения моей информации.