2012-11-29 25 views
1

我試圖創建一個註冊表單,其中包含大約20個不同的字段分爲四個不同的部分。 我爲此創建了一個自定義單元格,它包含一個標籤和一個UITextField,並且我的桌面視圖上有一個字典數組,指示標籤的名稱應該是什麼,以及texftield的標籤(因爲根據標籤我使用UIPicker輸入數據)。自定義單元格textfield沒有保存在UITableView中的內存

的問題是,當我開始編輯的字段,向下滾動並備份一切變得一團糟,而改變的字段不應該......我碰到這顯然是發生了,因爲我所以我試圖創建一個新的單元格,但這是行不通的,因爲它只會初始化我需要的確切數量的單元格的tableview,而只是沒有內容的空單元格(標籤也不是textfield)裏面。

什麼是最簡單的方法,所以我可以保持我的細胞的每一個不同的內存引用,考慮的事實,我有當按下一個按鈕來檢索他們的價值觀?

我讀過this後的建議,但仍然沒有關於如何創建單元陣列想法。

任何幫助?

這是我的定義代碼:

NSArray *section1 = [[NSArray alloc] initWithObjects: 
        [NSDictionary dictionaryWithObjectsAndKeys:@"100",@"tag",@"Title",@"title",@"title",@"fieldName",nil], 
        [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"First Name",@"title",@"first_name",@"fieldName",nil], 
        [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Last Name",@"title",@"last_name",@"fieldName",nil], 
        [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Job Title",@"title",@"job_title",@"fieldName",nil], 
        [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Email",@"title",@"email",@"fieldName",nil], 
        [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Confirm Email",@"title",@"confirm_email",@"fieldName",nil], 
        [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Password",@"title",@"password",@"fieldName",nil], 
        [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Confirm Password",@"title",@"conf_password",@"fieldName",nil], 
        [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Phone",@"title",@"phone",@"fieldName",nil], 
        nil]; 

.... 

self.formItems = [[NSArray alloc] initWithObjects: 
        section1, 
        section2, 
        section3, 
        section4, 
        section5, 
        nil]; 

然後我上的cellForRowAtIndexPath使用的代碼如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"freeTrialFormCell"; 
    TSIFreeTrialFormCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[TSIFreeTrialFormCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    NSArray* sectionData = [self.formItems objectAtIndex:indexPath.section]; 
    NSDictionary* myFieldInfo = [sectionData objectAtIndex:indexPath.row]; 

    if ([[myFieldInfo objectForKey:@"fieldName"] rangeOfString:@"password"].location != NSNotFound) { 
     cell.textField.secureTextEntry = YES; 
    } 

    cell.fieldName = [myFieldInfo objectForKey:@"fieldName"]; 
    cell.textField.placeholder = [myFieldInfo objectForKey:@"title"]; 
    cell.textField.tag = [[myFieldInfo objectForKey:@"tag"] integerValue]; 
    cell.label.text = [myFieldInfo objectForKey:@"title"]; 

    return cell; 
} 
+0

我忘了提及...我正在使用StoryBoarding。 –

回答

0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     TSIFreeTrialFormCell *cell = [[TSIFreeTrialFormCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"] autorelease]; 

    NSArray* sectionData = [self.formItems objectAtIndex:indexPath.section]; 
    NSDictionary* myFieldInfo = [sectionData objectAtIndex:indexPath.row]; 

    if ([[myFieldInfo objectForKey:@"fieldName"] rangeOfString:@"password"].location != NSNotFound) { 
     cell.textField.secureTextEntry = YES; 
    } 

    cell.fieldName = [myFieldInfo objectForKey:@"fieldName"]; 
    cell.textField.placeholder = [myFieldInfo objectForKey:@"title"]; 
    cell.textField.tag = [[myFieldInfo objectForKey:@"tag"] integerValue]; 
    cell.label.text = [myFieldInfo objectForKey:@"title"]; 

    return cell; 
} 

但是這將有性能損失爲您每一行創建細胞

+0

感謝您的回答,但正如我所提到的,這隻會創建一堆空單元格,沒有標籤,也沒有字段。我需要在自定義單元類上做些什麼嗎? –

0

的UITableView的重用細胞,你向上滾動和Dow n,所以你會失去只能輸入該單元格的信息。我所做的是創建一個數組來保存這些單元格的輸入。

基本上是:

enteredText = [[NSMutableArray alloc] init]; //iVar, not local variable 
for (int i=0; i<numTableRows; i++) { 
    [enteredText addObject:@""]; //fill with dummy values that you will replace as user types 
} 

然後在你的表視圖文本字段,並將自己設置爲文本字段的委託,實施textFieldDidEndEditing。在該方法中,將該行的enteredText中的值替換爲用戶的文本。

當你的電池,則文本字段文本設置爲您的數組中的值:

myCell.textField.text = [enteredText objectAtIndex:indexPath.row]; 

這將是空的,然後再將持有用戶的文本,他們已經把後有東西在裏面。

+0

蘇恩喜歡一個好主意,但是不重複使用細胞不是更好嗎,因爲它不是很多細胞?我已經使用我的自定義tableview控制器類作爲委託,所以無論如何它不會做太多的努力來做到這一點。 –