2012-01-01 143 views
0

在我的UITableView中,我試圖顯示我的plist中的所有項目,但它沒有顯示所有項目。實際上它顯示了大部分內容,但較低的項目由於某種奇怪的原因而重複。我基本上想要在plist中顯示它們各自的值。該列表是否太長而無法顯示?有大約30個項目。UITableView列表不顯示所有項目

首先,我嘗試對鍵進行排序,並認爲是問題所在,然後我根本沒有排序,並且出現同樣的問題,降低了列表中的項目重複次數並且沒有顯示最後3項。有限制嗎?

下面是一些代碼,我只是修改,以適應:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier1 = @"PreferencesCell1"; 
    static NSString *CellIdentifier2 = @"PreferencesCell2"; 
    static NSString *CellIdentifier3 = @"PreferencesCell3"; 

    UITableViewCell *cell;  

    NSArray *keys = [[[preferences objectAtIndex:indexPath.section] objectForKey:@"Rows"] allKeys]; 
    NSString *prefName = [keys objectAtIndex:indexPath.row]; 

    if (indexPath.section == 0 || indexPath.section == 2) { 

     if(indexPath.section == 0) 
      cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; 
     else if(indexPath.section == 2) 
      cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2]; 

     if (cell == nil) { 

      if(indexPath.section == 0) 
       cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1] autorelease]; 
      else if(indexPath.section == 2) 
       cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2] autorelease]; 

      cell.accessoryType = UITableViewCellAccessoryNone; 

      CGRect labelRect = CGRectMake(10, 5, 300, 31); 
      UILabel *settingName = [[UILabel alloc] initWithFrame:labelRect]; 
      settingName.font = [UIFont boldSystemFontOfSize:17.0]; 
      settingName.backgroundColor = [UIColor clearColor]; 
      settingName.text = prefName; 


      [cell.contentView addSubview: settingName]; 
      [settingName release]; 

     } 

    } else if(indexPath.section == 1) { 

     cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier3]; 

     if (cell == nil) { 
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier3] autorelease]; 

      CGRect labelRect = CGRectMake(10, 5, 300, 31); 
      UILabel *label = [[UILabel alloc] initWithFrame:labelRect]; 
      label.font = [UIFont boldSystemFontOfSize:17.0]; 
      label.backgroundColor = [UIColor clearColor]; 

      label.text = prefName; 

      [cell.contentView addSubview: label]; 
     } 

     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 

    return cell; 
} 

什麼我發現是,如果我不使用的標籤,只是去爲通用cell.textLabel.text那麼所有的項目都會正確顯示。但是,如果我使用UILabel方法,則不會顯示底部項目。我需要走這條路線,因爲我在Cell中添加了其他項目。

工作代碼。

必須首先創建單元格的初始化和創建,然後使用引用的單元格從超級視圖中刪除,然後渲染子視圖。所以重新排序上面的代碼。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     static NSString *CellIdentifier1 = @"PreferencesCell1"; 
     static NSString *CellIdentifier2 = @"PreferencesCell2"; 
     static NSString *CellIdentifier3 = @"PreferencesCell3"; 

     UITableViewCell *cell;  

     NSArray *keys = [[[preferences objectAtIndex:indexPath.section] objectForKey:@"Rows"] allKeys]; 
     NSString *prefName = [keys objectAtIndex:indexPath.row]; 

     // Create/Initialize Cell first 

     if (indexPath.section == 0 || indexPath.section == 2) { 

      if(indexPath.section == 0) 
       cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; 
      else if(indexPath.section == 2) 
       cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2]; 

      if (cell == nil) { 

       if(indexPath.section == 0) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1] autorelease]; 
       else if(indexPath.section == 2) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2] autorelease]; 
      } 

     } else if(indexPath.section == 1) { 

      cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier3]; 

      if (cell == nil) { 
       cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier3] autorelease]; 
      } 
     } 

     // remove from superview 

     [cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

     // render the subviews 

     if (indexPath.section == 0 || indexPath.section == 2) { 

      cell.accessoryType = UITableViewCellAccessoryNone; 

      CGRect labelRect = CGRectMake(10, 5, 300, 31); 
      UILabel *settingName = [[UILabel alloc] initWithFrame:labelRect]; 
      settingName.font = [UIFont boldSystemFontOfSize:17.0]; 
      settingName.backgroundColor = [UIColor clearColor]; 
      settingName.text = prefName; 


      [cell.contentView addSubview: settingName]; 
      [settingName release]; 

     } else if(indexPath.section == 1) { 

      CGRect labelRect = CGRectMake(10, 5, 300, 31); 
      UILabel *label = [[UILabel alloc] initWithFrame:labelRect]; 
      label.font = [UIFont boldSystemFontOfSize:17.0]; 
      label.backgroundColor = [UIColor clearColor]; 

      label.text = prefName; 

      [cell.contentView addSubview: label]; 

      cell.accessoryType = UITableViewCellAccessoryNone; 
      cell.selectionStyle = UITableViewCellSelectionStyleNone; 
     } 

     return cell; 
    } 
+0

你可以顯示numberOfRowsInSection回調方法嗎? – craig1231 2012-01-01 23:30:52

+0

我已經添加了該代碼,節號是正確的,所以對於節中的行數。 – fes 2012-01-01 23:34:51

回答

1

它看起來像單元格正在重用,你只是添加新的意見,其現有的內容。您需要重置內容,如下所述:UITbleViewCell Class Reference。如果你每次只設置單元的textLabel,在這裏設置一個新的值就足夠了,但是如果你添加子視圖,你可能需要更類似於[cell.contentView.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

+0

這正是我所需要的。我重新命令我的代碼最初創建單元格,因爲它弄糊塗要刪除什麼,然後在單元格初始化後再添加到removeFromSuperView中,然後再次渲染子視圖。謝謝! – fes 2012-01-02 10:34:23

0

Tableview的限制是可用的RAM大小。

請張貼一些代碼。但我認爲這可能是單元緩存的問題。

+0

我已經添加了一些代碼,我認爲它可能是單元緩存,但我不知道如何刪除緩存或如何刷新它? – fes 2012-01-01 23:28:34