Отправка данных от делегата контроллеру представления в Objective-C на iPhone

#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?