2016-04-19 24 views
1

私のアプリケーションにはUITableがあります。表のセルには、表のセルをロード中にUIStackViewを追加しました。UITableスクロール中にUIStackViewにUI要素を自動的に追加

テーブルをスクロールするまではうまくいきました。上下にスクロールするとスタックビューに要素が追加されます。 (要素はUIButtonsを意味し、私は将来UIlabelと置き換えます)

私はこの問題を解決するためのいかなる考えも持っていません。セルが(dequeueReusableCellWithIdentifierで)再利用されたときに、それはまだボタンが含まれ、すべての時間があなたのアプリケーションは、それがUIStackViewにボタンを追加しますセルを描画する必要があると思われるコードから

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    UIStackView *stkItems=(UIStackView *)[cell viewWithTag:8]; 

    for(int i=0;i<5;i++) { 
     UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem]; 
     [btn setTitle:@"test btn" forState:UIControlStateNormal]; 
     [stkItems addArrangedSubview:btn]; 
    } 
} 

答えて

1

..あなたに感謝しかし、あなたのコードは毎回より多くの追加を続けます。 UIStackViewに十分なボタンがあるかどうか、またはすべてのボタンをクリアして必要なものを追加するかどうかを確認する必要があります。これは、彼らが画面の外に行くとき

+0

はい、私は気にしていましたが、スタックビューでサブビューをクリアする方法はありました。 – gamal

+0

UIStackViewのsubviewsプロパティを反復処理し、UIStackViewのremoveArrangedSubview(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIStackView_Class_Reference/#//apple_ref/occ/instm/)を呼び出す必要があります。 UIStackView/removeArrangedSubview :)およびUIButtonのremoveFromSuperview(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/instm/UIView/removeFromSuperview)を参照してください。 、またはスタックビュー内のコントロールは何でも – Igniz

+0

スタックビューを取得したら、この行を追加することです。 [[stkItems subviews] makeObjectsPerformSelector:@セレクタ(removeFromSuperview)]; それは動作していません.. – gamal

4

テーブルビュー細胞を再利用することができます

希望。だからあなたはdequeueReusableCellWithIdentifier:という名前のメッセージを送ります。スタックビューからボタンを抜くことはありません。セルが再利用されるたびに、既にスタックビューにあるボタンにさらに5つのボタンが追加されます。

1

私はそれを解決したと思います。しかし、私はそれが標準になっているのか分かりません。

これは更新されたものです。 私は初期化し、上に0を宣言しています。

@implementation HistoryViewController 
int data=0; 

と、それは、細胞がUIStackViewを再利用しているので、あなたは新しいものを追加する前にサブビューを削除する必要が再び

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"%ld",indexPath.row); 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 


    if(data <=indexPath.row) 
    { 
     data=(int)indexPath.row; 
     UIStackView *stkItems=(UIStackView *)[cell viewWithTag:8]; 
     [stkItems.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)]; 
     for(int i=0;i<5;i++) { 
      UIButton *btn=[UIButton buttonWithType:UIButtonTypeSystem]; 
      [btn setTitle:@"test btn" forState:UIControlStateNormal]; 
      [stkItems addArrangedSubview:btn]; 
     } 
    } 



    return cell; 
} 
0

同じstackviewは更新されませんので、このようcellForRowAtIndexPathを変更。これを行うにはちょうどを通してあなたループの前に以下のコードを呼び出すと、あなたのUIStackViewに配置されたサブビューを追加します。

スウィフト3

for view in stackView.arrangedSubviews { 
    view.removeFromSuperview() 
} 

のObjective-C

for (UIView *view in stackView.arrangedSubviews) { 
    [view removeFromSuperview]; 
} 

*注:Appleのコメントによると[stackView removeArrangedSubview:view]と呼んだ場合、それは実際に完全に削除されませんfレシーバー。ビューを削除するには(UIViewの*)ビュー 「 受信機のサブビューとして、それを削除せずに配置されたサブビューのリストからサブビューを削除し : - (無効)removeArrangedSubview

:以下の引用文を参照してください。サブビューとして、通常のように-removeFromSuperviewを送信してください。 関連するUIStackViewは、arrangedSubviewsリスト から自動的に削除します。

関連する問題