2013-04-12 50 views
0

我正在開發一個應用程序使用Xcode 4.6.1> iOS 5.0版本。UITableView怪異行爲

該應用程序僅顯示從服務器端獲取的調查問卷,保存在數據庫中並允許其用戶填寫。

要顯示問題,我有UIScrollView,我正在使用pagingEnabled模式。我有三種問題選擇類型,分別是checkbox,radio buttontextfield。對於UI控件,我創建了CheckBoxButtonRadioButton類,它們只是從UIButton繼承而來。我通過更改背景圖像來設置選擇屬性。因此,每個頁面都包含一個問題,根據選擇數量包含checkboxes | radio buttons。如果選項數爲4,則顯示4個複選框。

如果問題和選擇不適合頁面,我創建一個UITableView,我將它作爲子視圖添加到UIScrollView。而不是使用UITableView,我試圖使用UIScrollView,但它讓事情變得更糟。所以,這不是一個真正的選擇。要創建UITableViewCell,我使用此代碼。

static NSString *cellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if(cell == nil) 
    { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone ; 
    } 
     QuestionChoice *currentChoice = [[[[_questionArray objectAtIndex:currentQuestionIndex] choices] allObjects ] objectAtIndex:indexPath.row -1 ]; 
     CheckBoxButton *checkBox = [[CheckBoxButton alloc] initWithXValue:20 yValue:0 tag:0]; 
     [cell addSubview:checkBox]; 
     UIFont *aeroSmall = [UIFont fontWithName:@"Aero" size:22.0f]; 
     NSString *choiceText = currentChoice.choiceText; 
     CRTLabel *choiceLabel = [[CRTLabel alloc] initWithFrame:CGRectMake(80, 0, 700, 44) andText:choiceText font:aeroSmall tag:0]; 
     [cell addSubview:choiceLabel]; 

我知道如果一個單元格不在屏幕上,它不存在。我的問題是與此。假設我已經選中了第四個複選框並向上滾動,所以第四個單元格不再顯示。當我向下滾動時,第四個單元格將通過使用上述代碼進行重新創建。我的問題是它是以舊狀態創建的。這意味着當我檢查之前向上滾動,它被檢查重新創建。

這怎麼可能?我錯過了什麼?我沒有使用任何緩存機制。

回答

1

爲了提高效率,iOS重用了表格單元格。當你的單元格離開屏幕時,它不會被釋放。相反,它被放入重用隊列中。當單元格再次出現在屏幕上時,系統會從重新使用隊列中抓取單元格(如果可用)並將其交給您。您之前添加到該單元格中的所有子視圖仍然存在,因此您需要清理該單元格並正確初始化,否則您將看到以前在該單元格中的任何內容。

UITableView用於顯示錶格。它不用於存儲任何信息。在你的情況下,如果有人檢查它,你會想知道複選框的狀態。要獲得該狀態,您需要將targetaction添加到您的複選框,以便在有人觸摸該複選框並更改其狀態時您將會被調用。

在您的操作方法中,您需要將複選框的值存儲在作爲視圖控制器(而非表視圖)一部分的數據結構中。重新創建屏幕外的單元格時,您還需要查看此數據結構,但現在已重新出現。

+0

如果未取消分配,假設第0節中的第四個單元格不顯示,爲什麼我在cellForAtIndexPath方法後得到零,這是否正常? – limon

+0

我不清楚評論中的問題。什麼值'nil'什麼時候? – vacawama

+0

比方說,第四個單元格不在屏幕上,當我使用self.tableView cellForAtIndexPath:indexPath,對於第0和第4行,我得到零。但是,你說過屏幕外的單元沒有被釋放。 – limon