2011-07-08 56 views
1

您好我正在學習如何在Objective-C中編寫代碼。我想將我的視圖中的文本字段的值存儲在數組中:iPhone App - NSArray問題

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

+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對象時,請使用%@格式。另外,如果不先檢查計數,則訪問陣列的對象是不安全的。

-(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

這取決於你正試圖用這些存儲的值做什麼。例如,您是否期望在程序的整個生命週期中從集合中讀取它們?如果是這樣,多久?關於你當前設計的一件事情,它的工作原理是'高效的',但它並沒有給你提供一種檢索你存儲的所有值的可靠方法。例如,您希望稍後在您的程序中更新物理恢復值,您將如何處理它?

在您當前的設置中,您必須知道physicalRecovery位於陣列中的索引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: 
    [email protected], fluidIntake.text, 
    .... 
    KEY_GENERALFATIGUE, generalFatigue.text, 
    nil]; 

後來訪問的價值觀上,你會做到這一點:

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

字典的主要好處是,稍後您可以添加更多的數據類型,並且不必擔心記住將數組存儲在哪個索引處。

希望有幫助!

+0

再一次,@Sergio和我發佈了類似的解決方案!哈哈。 – Perception

1

不,這是一個壞主意,如果沒有設置,文本將返回nil,這將終止您的數組。 你應該真的使用字典(爲了便於調試和將來的維護),並檢查它的值是否爲someField.text==nil,如果它確實插入[NSNull null]

+0

有更好的選擇,插入[NSNull空]來表示一個'空'索引,我會建議反對它。 – InsertWittyName

+0

與我一樣,但如果你必須表示一個零值,你可以使用NSNull。在字典中沒有關鍵字會更好,但是如果你使用的是帶有對象列表的數組構造函數,並且你希望索引是有意義的,那麼你不能只在那裏拋出可能爲零的值,因爲它會終止數組的構造。 –

0

就這麼簡單!

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