#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.html2. countryDB — это NSMutableArray, а countries — это NSMutableArray, который у меня есть в моем делегате (просто чтобы вы знали, я не предполагаю использовать titleDB) приветствия
3. Является ли BookPhoto файлом? Или строка? isEqualToString: ожидает, что перед ним будет строка!
4. Кроме того, извините, я пропустил один шаг. В вашем приложении: didFinishLaunchingWithOptions в вашем файле AppDelegate, поместите следующий оператор в начале, чтобы установить глобальную переменную: AppDelegate = self;