загрузка данных в uipickerview с помощью NSMutableArray, расположенного в делегате приложения

#iphone #xml #parsing #uipickerview

#iPhone #xml #синтаксический анализ #uipickerview

Вопрос:

по сути, я проанализировал некоторые данные из XML в NSMutableArray, который используется совместно в AppDelegate.

в моем SecondViewController у меня есть UIPickerView, в который я хочу загрузить детали массива.

Мой вопрос … как?

я кратко работал с UIPickerView раньше, и мне приходилось сначала загружать данные, чтобы назначить UIPickerView следующим образом:

 titleDB = [[NSMutableArray alloc] init];
[titleDB addObject:@"MR"];
[titleDB addObject:@"Mrs"];
[titleDB addObject:@"Ms"];
[titleDB addObject:@"Miss"];
[titleDB addObject:@"DR"];
[titlePickerView selectRow:1 inComponent:0 animated:YES];
 

но поскольку данные поступают из AppDelegate, я не знаю, как мне следует загружать их в UIPickerView, связано ли это с источником данных?

Я прошу бросить мне код, я просто прошу лучший способ сделать это.

Любая помощь по этому вопросу была бы отличной

Спасибо Jonn4y

Ответ №1:

Это обычная схема. Вы захотите получить доступ к экземпляру sharedApplication от UIApplication. Итак, предполагая, что ваш класс AppDelegate называется YourAppDelegate, массив ivar в YourAppDelegate и ViewController имеет значение titleDB, тогда вы можете сделать это в методе viewDidLoad вашего ViewController viewDidLoad

 YourAppDelegate *appDelegate=(YourAppDelegate *)[[UIApplication sharedApplication] delegate];
// assuming you are using @property and @synthesize for your ivars
self.titleDB=appDelegate.titleDB;
 

Удачи

Ответ №2:

По сути, вы хотите получить доступ к объекту AppDelegate из случайных мест в коде. Это не необычный запрос. Помните, что Objective C является надмножеством языка C. И поэтому вы можете использовать глобальную переменную. Какая более естественная переменная была бы в программе Cocoa, чем делегат приложения, по причинам, указанным выше. Итак, в вашем файле AppDelegate .h добавьте:

 <MyAppDelegateClass> * appDelegate;
 

Замените MyAppDelegateClass именем вашего класса AppDelegate. Затем просто включите файл .h вашего AppDelegate в любое место, где вы хотите использовать переменную AppDelegate, и просто используйте (в вашем примере):

[AppDelegate titleDB]

или создайте локальный iVar:

NSMutableArray * titleDB = [AppDelegate titleDBData];

Затем в вашем методе делегирования приложения didFinishLaunchingWithOptions добавьте следующую строку:

 appDelegate = self;
 

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

1. привет, спасибо за помощь, я пробовал это, и все это связано правильно, когда я вызываю NSLOG, я вижу данные из базы данных, но когда я пытаюсь countryDB = appDelegate.countries; , он выходит из строя, сообщая мне Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[BookPhoto isEqualToString:]: unrecognized selector sent to instance 0x6d70440' , что BookPhoto — это файл, который я использовал для анализа XML в первую очередь, поэтому не уверен, почему он вызываетсяздесь я получил синтаксический анализ xml: iPhoneSDKArticles.com/2008/12/parsing-xml-files.html

2. countryDB — это NSMutableArray, а countries — это NSMutableArray, который у меня есть в моем делегате (просто чтобы вы знали, я не предполагаю использовать titleDB) приветствия

3. Является ли BookPhoto файлом? Или строка? isEqualToString: ожидает, что перед ним будет строка!

4. Кроме того, извините, я пропустил один шаг. В вашем приложении: didFinishLaunchingWithOptions в вашем файле AppDelegate, поместите следующий оператор в начале, чтобы установить глобальную переменную: AppDelegate = self;