2011-07-08 7 views
1

こんにちは私はObjective-Cでコーディングする方法を学んでいます。私はビュー内のテキストフィールドの値を配列に格納します:iPhone App - NSArray Issue

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"]; 
} 

それは、ボタンが押されるとトリガされます。 NSArrayのテキストフィールドに入力された8個の値を格納し、これを配列の最初の要素(つまり最初のテキストフィールド値)を印刷しようとするModelクラスの関数に渡す必要があります。

しかし、それは印刷されません:PersonalDiary [37114:207] __NSArrayI

+0

あなたはその間にはるかに多くのコードを投稿しました。私はそれがもう役に立たなかったので私の答えを削除しました。 @Joeと@Grady Playerの回答はとても良いです。 – fzwo

答えて

3

この方法では、配列のインデックスに間違った種類の文字列を使用しています。

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

ans[0]あなたNSArrayのポインタアドレスを印刷し、あなたの要素にアクセスしません。あなたの配列にアクセスするには、objectAtIndex:を使用する必要があります。すべてのNSStringリテラルに接頭辞@を付ける必要があります。どのような種類のObjective-Cオブジェクトでも、%@ formatを使用してください。また、配列のオブジェクトにアクセスすることは、カウントを最初にチェックしなくても安全ではありません。

-(void) post:(NSArray*) ans to:(NSString*) link{ 
    NSString* a = @"Hello"; 
    NSLog(@"%@ %@", a, [ans objectAtIndex:0]); 
    //Or print entire array 
    NSLog(@"%@", ans); 
} 
2

これは可能です。うまく動作するはずです。あなたがやっていることについてもっと知ることなく、もっと話すのは難しいですが、それを求めてください。

2

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"]; 
+0

私はこのようにして "あまりにも多くの引数"警告を受ける – user559142

+0

申し訳ありませんが、私はそれを修正... – sergio

2

それが依存していますこれらの保存された値で何をしようとしていますか。たとえば、プログラムのライフタイム中にコレクションからそれらを読み取ることを期待していますか?そしてもしそうなら、どのくらいの頻度で?あなたの現在のデザインについての1つのことは動作し、効率的ですが、保存しているすべての値を取得するためのメインの方法はありません。ケース・イン・ポイントで、あなたのプログラムで後でphysicalRecoveryの値を更新したいのですが、どうやってそれを調べますか?

現在の設定では、physicalRecoveryはアレイのインデックス4にあることがわかります。小さなデータの集まりでは(おそらく)大丈夫ですが、これはあなたのプログラムを脆弱にし、維持するのを困難にします。

NSDictionaryを使用して情報を保存する代わりに、代わりにお勧めします。アレイと非常に似ていますが、あらかじめ定義されたキーを使って情報にアクセスすることができ、保守性が大幅に向上します。たとえば、次のように

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; 

そして、あなたの中:どこか.hファイル内

。メートルのファイル:

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

そして中にあなたがそうのような辞書に値を格納することができ:

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

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

そして、あなたの上に後から値にアクセスするためには、これを行うだろう辞書の主な利点は、後でデータ型を追加することができ、配列に格納するインデックスを覚えておく心配がありません。

希望に役立ちます!

+0

@Sergioと私は同様のソリューションを投稿します!ハハ。 – Perception

1

いいえ、それは設定されていない場合、テキストはnilを返し、あなたの配列を終了します。 ディクショナリを実際に使用して(デバッグや将来のメンテナンスを容易にするために)、someField.text==nilの値を確認し、代わりに[NSNull null]を挿入する必要があります。

+0

「空の」インデックスを表すために[NSNull null]を挿入する方が良いオプションがあります。私はそれに対して助言します。 – InsertWittyName

+0

と同じですが、nil値を表現する必要がある場合は、NSNullを使用できます。キーは辞書内では良いとは言えませんが、オブジェクトのリストを取得する配列コンストラクタを使用していて、インデックスを意味のあるものにしたい場合は、そこに値を入れて終了することはできません配列の構築 –

0

このように簡単です!

NSArray *array = @[textfield1.text, textfield2.text, textfield3.text];