#iphone #objective-c
#iPhone #objective-c
Вопрос:
Примечание: Я использую Objective-C всего неделю.
Вот моя конечная цель: я хочу обратиться к серверу и получить файл json, содержащий URL-адреса и URL-описания в нем. Если я не могу получить этот файл, я хочу показать представление с ошибкой. Если я смогу получить этот файл, я хочу отобразить его содержимое в виде таблицы.
Ограничения: Я делаю это в статической библиотеке Cocoa Touch (по требованию) для включения в более крупное приложение, которое будет загружать его «как» приложение.
Что я делаю прямо сейчас, так это использую Reachability для проверки подключения к хосту. Затем я открываю NSURLConnection для файла. Как только файл получен, я анализирую json с помощью json-framework. Типом данных JSONObject является id (afaik, что означает *).
В настоящее время ВСЕ это происходит в делегате. Если я получаю ошибки при подключении или извлечении файла, я устанавливаю rootView на контроллер просмотра ошибок. В противном случае я устанавливаю rootView в свой другой вид.
Я попробовал метод установки JSONObject в значение extern в контроллере представления, но это не сработало. Я попытался установить свойство в контроллере представления и установить JSONObject в контроллере после его создания, но в этот момент JSONObject равен нулю, и все заканчивается с некоторой ошибкой, связанной с неправильными селекторами или чем-то еще.
Я вообще двигаюсь в правильном направлении с этим? Как это ДОЛЖНО быть сделано?
Редактировать
Мой контроллер представления набран как UINavigationController, и я вставляю в него тот контроллер представления, который в конечном итоге использую. Когда я пытаюсь вызвать установщик в моем контроллере представления, я должен привести UINavigationController к моему типу представления, чтобы иметь возможность видеть установщик, но когда я запускаю его, я получаю следующую ошибку:
SpringboardApplication[5850:40b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController setJsonObject:]: unrecognized selector sent to instance 0x602ed20'
Я вызываю это следующим образом:
[(LU_SOCLINKS_RootViewController *) root_navigation_controller setJsonObject:jsonObject];
Ответ №1:
Под «делегированием» вы подразумеваете делегирование приложения? Я предполагаю, что контроллер представления находится в переменной экземпляра в делегате вашего приложения, и в этом случае вам просто нужно создать метод setter в контроллере представления, который вы можете использовать для передачи данных.
В контроллере представления:
.h
- (void)setData:(NSData/NSString/whatever *)data;
.m
- (void)setData:(NSData/NSString/whatever *)data {
vcData = [data retain];
// do stuff with the data
}
В делегате приложения
[viewController setData:theData];
Это упрощенный ответ. Я правильно понимаю вашу проблему?
Комментарии:
1. Я попробую сделать это специально, но я попытался установить свойство и @synthesize в файле .m для контроллера представления. у .h был «идентификатор JSONObject», а у .m был «@synthesize JSONObject». Но вызов ViewController.JSONObject = MyObject заставил его очень разозлиться на селекторы (возможно, потому, что MyObject в то время был равен нулю?)
2. … перечитайте ваш вопрос. синтез свойства должен работать нормально. Почему / где находится объект JSON nil в вашем контроллере представления? Возможно, это настоящая проблема. Вам необходимо сохранить их, чтобы вы могли успешно передать их контроллеру представления.
3. Я отредактировал свой вопрос, чтобы дать более подробную информацию. Похоже, программа не видит мое приведение.
4. Сообщение об ошибке консоли сообщает вам, что контроллер представления на самом деле является UINavigationController, а не LU_SOCLINKS_RootViewController. Приведение переменной не изменяет значение.
5. Итак, если root_nagivation_controller является UINavigationController и я устанавливаю root_navigation_controller = LU_SOCLINKS_RootViewController, почему я не могу привести переменную для доступа к элементам LU_SOCLINKS_RootViewController?