2016-04-19 4 views
1

В моем приложении есть UITable.In ячейке таблицы я добавил UIStackView для заполнения при загрузке ячейки таблицы.Автоматическое добавление элементов пользовательского интерфейса в UIStackView во время UITable Scrolling

Он работал нормально, пока не прокрутился вниз по столу. В стеке добавлено больше элементов при прокрутке вверх и вниз. (элементы означают UIButtons, я буду заменять их UIlabel в будущем)

У меня нет никакой идеи для решения этой проблемы. Спасибо ..

- (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, поэтому, когда клетка повторно (по dequeueReusableCellWithIdentifier) ​​он все еще содержит кнопки , но ваш код продолжает добавлять больше каждый раз. Возможно, вы должны проверить, есть ли у UIStackView достаточно кнопок или очистить все кнопки и добавить то, что вам нужно.

Надеется, что это помогает

+0

Да, это было у меня на уме, но как очистить subviews в стеке. – gamal

+0

Вы должны выполнить итерацию через свойство subviews UIStackView и вызвать removeArrangedSubview UIStackView (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIStackView_Class_Reference/#//apple_ref/occ/instm/ UIStackView/removeArrangedSubview :) и removeFromSuperview (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/instm/UIView/removeFromSuperview) UIButton , или какой-либо элемент управления находится в представлении стека. – Igniz

+0

Что вы имеете в виду, это добавить эту строку после получения представления стека. [[stkItems subviews] makeObjectsPerformSelector: @selector (removeFromSuperview)]; Это не работает. – gamal

4

Представлению таблицы повторно клетки, когда они выходят за пределами экрана. Вот почему вы отправляете сообщение с именем dequeueReusableCellWithIdentifier:. Вы никогда не выбираете кнопки из представления стека. Каждый раз, когда ячейка повторно используется, вы добавляете еще пять кнопок к кнопкам, которые уже находятся в представлении стека.

1

Я думаю, что решил. Но я не знаю, насколько это стандартно.

это обновленный. Я инициализировал и объявлял его до 0.

@implementation HistoryViewController 
int data=0; 

и изменение cellForRowAtIndexPath как это так, что не будет обновлять же самый stackview снова

-(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

Поскольку ячейка повторного использования UIStackView вы должны удалить подвидов, прежде чем добавлять новые. Для этого просто вызовите следующий код перед вами перебрать и добавьте расположенные подвидов к вашему UIStackView:

Swift 3

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

Objective-C

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

* Примечание : Если вы вызываете [stackView removeArrangedSubview: view] согласно комментариям Apple, он фактически не удаляет его полностью f запустите приемник. Смотрите цитата ниже:

- (Недействительными) removeArrangedSubview:. (UIView *) вид «Удаляет подвид из списка упорядоченных подвидов, не снимая его как подвид приемника Чтобы удалить представление как subview, отправьте его -removeFromSuperview, как обычно: соответствующий UIStackView автоматически удалит его из его организованного списка просмотра . "