2011-10-07 51 views
1

我在iPad的tableview的每個單元格中都有3個分段控件。方向始終是應用程序的風景,並且應用程序上每次運行的單元格數量都會有所不同。如果行數大約小於10,應用程序性能會很好,但在任何高於此值的位置,都會出現毛刺。在包含每個單元格中的UI元素的UITableView中慢速滾動

對於我正在構建的應用程序,我可以有多達70行==>含義,210個UISegmentedControls,所有這些都一次性分配在內存中。

有沒有解決方法?有沒有一種方法可以重用這些UISegmentedControls?如果是的話,我該如何保持分段控制的狀態?

否則,有人可以提出一個新的解決方案嗎? (每個分段控件都有項目「A」和「B」,並且有三個分段控件,代表對應於表格每一行的每個對象的三個不同參數)。

UPDATE:

下面的代碼:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    // Configure the cell... 
    segmentedControl1 = (UISegmentedControl*)[array1 objectAtIndex:[indexPath row]]; 
    segmentedControl1.frame = CGRectMake(180, 15, 100, 30); 
    [cell.contentView addSubview:segmentedControl1]; 

    segmentedControl2 = (UISegmentedControl*)[array2 objectAtIndex:[indexPath row]]; 
    segmentedControl2.frame = CGRectMake(450, 15, 100, 30); 
    [cell.contentView addSubview:segmentedControl2]; 

    segmentedControl3 = (UISegmentedControl*)[array3 objectAtIndex:[indexPath row]]; 
    segmentedControl3.frame = CGRectMake(725, 15, 100, 30); 
    [cell.contentView addSubview:segmentedControl3]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell; 
} 
+0

從'-tableView:cellForRowAtIndexPath:'發佈你的代碼,它會使我們更容易幫助你。 – hypercrypt

+0

添加了麻煩的代碼!對不起,如果你們不記得這個問題了! – Ravi

+0

你說這個「對於我正在構建的應用程序,我可以有多達70行==>含義,210個UISegmentedControls,一次都在內存中分配。」,但是接下來你說你正在回收單元。除非你以某種方式阻止它,否則從屏幕邊緣滾開的細胞應該幾乎立即被回收,因此一次只能存放十幾個細胞。 –

回答

1

創建自定義UITableViewCell子類。在這三個屬性爲你的三個UISegmentedControl S和在init方法添加它們:

@interfate MyCell : UITableViewCell 
@property (nonatomic, retain, readonly) UISegmentedControl *control1; 
@property (nonatomic, retain, readonly) UISegmentedControl *control2; 
@property (nonatomic, retain, readonly) UISegmentedControl *control3; 
@end 

@implementation 

@synthesize control1 = _control1; 
@synthesize control2 = _control2; 
@synthesize control3 = _control2; 

- (id)init 
{ 
if ((self = [super init])) 
{ 
    _control1 = [[UISegmentedControl alloc] init...]; 
    _control1.frame = CGRectMake(...); 
    [self addSubView:_control1]; 

    // repeat with control2 & control3 
} 
//... 
@end 

然後,而不是存儲的UISegmentedControl小號陣列可以再有NSNumber陣列保持選定的指數。

你會那麼做這樣的事情:

cell.control1.selectedIndex = [[array1 objectAtIndex:indexPath.row] integerValue]; 

您還可以創建自定義對象來保存這些數據,並將它們存儲在一個陣列中。

+0

很酷,工作!謝謝。 – Ravi

0

我從來沒有見過一個UITableView保持「活」不止一個或兩個單元超出顯示在屏幕上。您是否在使用dequeueReusableCellWithIdentifier回收您的細胞?

+0

'dequeueReusableCellWithIdentifier'正在使用中... – Ravi

0

我懷疑你的問題不是分段控制。 UITableView具有內置的方法來處理加載和重新加載類,因爲它們不在屏幕上,所以所有210個控件都不應該一次存儲在內存中。

我會首先檢查以確保您正確使用dequeueReusableCellWithIdentifier:(尤其是如果每個UITableViewCell都是相同的類)。也許還要檢查內存泄漏。

+0

我正在使用'dequeueReusableCellWithIdentifier'。我有一個動態生成的分段控件的NSMutableArray,我希望看到它的行爲正確。 – Ravi

+0

啊,好的。不要保留一組分段控件。將segmentedControl添加爲「if」語句的單元*內*的子視圖,並跟蹤viewController中的段*值*。然後,只需在if語句下方的塊中將segmentedControl設置爲正確的值(即cell.segmentedControl1.selectedSegmentIndex = )。在這種情況下,segmentedControl將是單元格的屬性。 (你可以繼承UITableViewCell)。 –

0

當單元格被創建時,您可以在單元格中爲索引路徑中的行分配分段控件。 在索引路徑中將它們分配到行中。在(cell == nil)條件下分配並添加分段控件。

您可以對所有單元再用3個分段控件。並保持一個數組來保存更改的值。

1

你應該重新使用UITableViewCells,其中包含三個通用UISegmentedControls。當調用tableView:cellForRowAtIndexPath:時,應該爲每個分段控件設置正確的值 - 始終。

這些值必須存儲在「其他位置」,在單元格外,最有可能與您獲取單元格其他數據的位置相同。

更新與守則草案,不應該編譯爲-是:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *cellId = @"CellId"; 
static NSString *cellNib = @"Cell"; 

UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellId]; 
if (cell == nil) { 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:cellNib owner:self options:nil]; 
    for (id nibItem in nib) 
    { 
     if ([nibItem isKindOfClass:[UITableViewCell class]]) 
     { 
      cell = (UITableViewCell *)nibItem; 
      break; 
     } 
    } 
} 

// Configure the cell, all values! 
UISegmentedControl *seg = nil; 
seg = (UISegmentedControl *)[cell viewWithTag:1]; 
seg.selectedSegmentIndex = 0 

UISegmentedControl *seg = nil; 
seg = (UISegmentedControl *)[cell viewWithTag:2]; 
seg.selectedSegmentIndex = 0 

return cell; 
} 

的想法是,你在Interface Builder創建自定義的UITableViewCell模板與3分段控制。爲每個控件提供一個UNIQUE標籤ID號。使用標記ID訪問每個特定控件並設置所有值 - 因爲您正在重複使用相同的單元格,並且默認情況下它們將包含舊值。

Btw有關細胞無選擇......好吧,有很多方法可以做到這一點,甚至寫了一個關於它的博客「How to Disable UITableCell Selection」。是的,它很老,並且題目錯了,但應該工作。

希望這有助於:)

+0

我無法完全將您的評論與我的要求聯繫起來。我已經發布了代碼......你現在能夠提出一些建議嗎? – Ravi

相關問題