iPhone App - NSArray Issue - PullRequest
       6

iPhone App - NSArray Issue

1 голос
/ 09 июля 2011

Привет, я учусь кодировать в Objective-C.Я хочу сохранить значения текстовых полей в моем виде в массиве:

NSArray* answers = [NSArray arrayWithObjects:fluidIntake.text, sleepQuality.text, sleepQuantity.text, mentalRecovery.text, 
                          physicalRecovery.text, pretrainingEnergy.text, muscleSoreness.text, generalFatigue.text, nil];

Возможно ли это?Если нет, то есть какой-нибудь более чистый способ хранения нескольких значений текстового поля без необходимости присваивать их переменной NSString.

Обновление:

Вот функция в моем контроллере представления:

-(IBAction)postData:(id)sender{ 
    diary = [[PersonalDiary alloc]init];

    NSArray* answers = [NSArray arrayWithObjects:fluidIntake.text, sleepQuality.text, sleepQuantity.text, mentalRecovery.text, 
                          physicalRecovery.text, pretrainingEnergy.text, muscleSoreness.text, generalFatigue.text, nil];


    [diary post:answers to:  @"http://www.abcdefg.com/test.php"];   
}

Он срабатывает при нажатии кнопки.Он должен хранить 8 значений, введенных в текстовые поля в NSArray, и передать их функции в моем классе Model, которая в минуту пытается напечатать первый элемент в массиве (т.е. первое значение текстового поля):

-(void) post:(NSArray*) ans to:(NSString*) link{
    NSLog(@"%@", ans[0]); 
}

Но это не так, он просто печатает: PersonalDiary [37114: 207] __NSArrayI

Ответы [ 6 ]

3 голосов
/ 09 июля 2011

Вы неправильно индексируете массив в этом методе и используете неверный тип строки.

-(void) post:(NSArray*) ans to:(NSString*) link{
    NSString* a = "Hello";
    NSLog(@"%s%d", a, ans[0]); 
}

ans[0] напечатает адрес указателя вашего NSArray и не будет обращаться к вашим элементам.Для доступа к вашему массиву вам нужно использовать objectAtIndex:.Все литералы NSString должны иметь префикс @.И когда вы печатаете любой объект Objective-C, используйте формат% @.Также небезопасно обращаться к объектам массива без предварительной проверки счетчика.

-(void) post:(NSArray*) ans to:(NSString*) link{
    NSString* a = @"Hello";
    NSLog(@"%@ %@", a, [ans objectAtIndex:0]); 
    //Or print entire array
    NSLog(@"%@", ans);
}
2 голосов
/ 09 июля 2011

Это зависит от того, что вы пытаетесь сделать с этими сохраненными значениями. Например, ожидаете ли вы читать их из коллекции во время жизни вашей программы? И если да, то как часто? Одна вещь о вашем текущем дизайне, он работает и «эффективен», но он не дает вам приемлемого способа получения всех значений, которые вы храните. Например, вы хотите обновить значение физического восстановления позже в вашей программе, как вы это решите?

В вашей текущей настройке вы должны знать, что физическое обнаружение имеет индекс 4 в вашем массиве. В то время как (возможно) хорошо для небольших коллекций данных, это делает вашу программу хрупкой и сложной в обслуживании.

Я бы рекомендовал в качестве альтернативы использовать NSDictionary для хранения своей информации. Он очень похож на массив, но вы сможете получить доступ к своей информации через предопределенные ключи - значительно улучшая удобство обслуживания. Например:

Где-то в вашем .h файле:

extern NSString * const KEY_FLUIDINTAKE;
extern NSString * const KEY_SLEEPQUALITY;
extern NSString * const KEY_SLEEPQUANTITY;
extern NSString * const KEY_MENTALRECOVERY;
extern NSString * const KEY_PHYSICALRECOVERY;
extern NSString * const KEY_PRETRAININGENERGY;
extern NSString * const KEY_MUSCLESORENESS;
extern NSString * const KEY_GENERALFATIGUE;

А в вашем .m файле:

NSString * const KEY_FLUIDINTAKE = @"fluidIntake";
...
NSString * const KEY_GENERALFATIGUE = @"generalFatigue";

И тогда вы можете хранить свои значения в словаре следующим образом:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
    KEY_FLUIDINTAKE@, fluidIntake.text,
    ....
    KEY_GENERALFATIGUE, generalFatigue.text,
    nil];

И чтобы получить доступ к значениям позже, вы должны сделать это:

NSString * physicalRecoveryVal = (NSString *) [dict objectForKey: KEY_GENERALFATIGUE];

Основное преимущество словаря состоит в том, что в дальнейшем вы можете добавлять больше типов данных, и вам никогда не придется беспокоиться о том, чтобы запомнить, по какому индексу вы будете хранить их в своем массиве.

Надеюсь, это поможет!

2 голосов
/ 09 июля 2011

Использование NSArray в порядке. Можно также подумать об использовании NSDictionary, который позволил бы связать значение текстового поля с именем текстового поля:

 NSArray* values = [NSArray arrayWithObjects:fluidIntake.text ... nil];
 NSArray* keys = [NSArray arrayWithObjects:@"fluidIntake" ... nil];
 NSDictionary* answers = [NSDictionary dictionaryWithObjects:values forKeys:keys];

тогда вы можете получить такие значения:

 NSString* fluidIntake = [answers objectForKey:@"fluidIntake"];
2 голосов
/ 09 июля 2011

Это возможно.Должно работать нормально.Трудно сказать больше, не зная больше о том, что ты делаешь, но сделай это.

1 голос
/ 09 июля 2011

НЕТ, это плохая идея, текст вернет nil, если он не установлен, и это прекратит работу вашего массива. вы должны действительно использовать словарь (для простоты отладки и будущего обслуживания) и проверять, чтобы увидеть его значения someField.text==nil и, если он вставляет [NSNull null] вместо.

0 голосов
/ 16 марта 2017

Так просто, как это!

NSArray *array = @[textfield1.text, textfield2.text, textfield3.text];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...