2015-09-28 1 views
0

Я использовал этот код в cellForRowAtIndexPath метод. Когда я нажимаю кнопку или таблицу прокрутки, эта кнопка отображается два раза. Почему эта кнопка показана 2 раза, пожалуйста, помогите мне?cellForRowAtIndexPath метод пользовательская кнопка показать 2 раза

UIButton *trashbtn=[[UIButton alloc]initWithFrame:CGRectMake(cell.frame.size.width-20, cell.frame.size.height-30, 20, 20)]; 
[trashbtn setImage:[UIImage imageNamed:@"editor_trash"] forState:UIControlStateNormal]; 
[trashbtn addTarget:self action:@selector(DeleteMyAssociate:) forControlEvents:UIControlEventTouchUpInside]; 
[trashbtn setTag:indexPath.row]; 
[cell addSubview:trashbtn]; 

ответ

0

Вы должны сначала добавить UITableViewCell в свою таблицу в IB. Затем введите идентификатор, например. «MyCellIdentifier» в эту ячейку. Все еще на IB, добавляйте свои розетки в эту ячейку, например. кнопка, текстовые поля ... Вы можете изначально установить кнопку невидимой. Затем в методе cellForRowAtIndexPath, вы делаете:

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"]; 
    if(cell){ 
     myButton.hidden = NO; // 
     myTextField.text = @"BlaBlaBla"; 
    } 
} 
+0

Это действительно старый метод получения ячеек. Если вы используете метод ' - dequeueReusableCellWithIdentifier: forIndexPath:', и вы либо правильно зарегистрировали идентификатор ячейки, либо создали ячейку в раскадровке, то она будет всегда возвращать ячейку, поэтому нет необходимости проверять, была ли возвращенная ячейка ноль или нет. – Abizern

+0

Тот факт, что я проверяю ячейку, не равен нулю, это не значит, что это старый метод. Если вы сделаете катастрофу в файле IB, вы поймаете ее в ловушку. Мои приложения очень надежны, потому что я делаю их так. – Leonardo

+0

Я использую это в методе cellforrowAtIndexPath static NSString * simpleTableIdentifier = @ "CustomCell"; CustomCell * cell = (CustomCell *) [таблицаView dequeueReusableCellWithIdentifier: simpleTableIdentifier]; if (cell == nil) { NSArray * nib = [[NSBundle mainBundle] loadNibNamed: @ "CustomCell" владелец: self опции: nil]; cell = [nib objectAtIndex: 0]; } –

0

Эй, я могу дать вам предложение, что использование автоматической компоновки и раскадровку кнопку, чтобы добавить вместо того, чтобы добавить его программно.
Это лучше и более чистый подход.

+0

Если это предложение, возможно, это лучше, чем комментарий, а не комментарий. – Abizern

+0

нормально, но вы можете попробовать это. –

+0

static NSString * simpleTableIdentifier = @ "CustomCell"; CustomCell * cell = (CustomCell *) [таблицаView dequeueReusableCellWithIdentifier: simpleTableIdentifier]; if (cell == nil) { NSArray * nib = [[NSBundle mainBundle] loadNibNamed: @ "CustomCell" владелец: self опции: nil]; cell = [nib objectAtIndex: 0]; } Я использую это после этого, я хочу добавить кнопку в ячейку. –

0

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

Есть два способа исправить это.

Во-первых, удалите кнопку в методе prepareForReuse ячейки, которая вызывается сразу после повторного использования ячейки.

Во-вторых, избегайте создания пользовательских представлений в методе cellForTableView.... Используйте пользовательскую ячейку, у которой уже есть кнопка. Теперь вы можете спросить, как я могу активировать действие для кнопки, если я это сделаю? Вы можете либо предоставить метод делегата для своей ячейки, который обращается к вашему контроллеру представления, либо вы можете передать ячейке блок, который будет выполняться при нажатии кнопки.

0

, насколько я могу получить у уже есть пользовательские ячейки .. добавить кнопку в существующую ячейку и создать IBOutlet для того же в customCell.h файл затем в метод доступа cellForRowAtIndexPath кнопку с помощью его IBOutlet

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 

    customCell *cell =(customCell*) [tableView dequeueReusableCellWithIdentifier:@"customCell" forIndexPath:indexPath]; 

    [cell.btn setTitle:@"blabla" forState:UIControlStateNormal]; 
    [cell.btn setTag:indexPath.row]; 
    [cell.btn addTarget:self action:@selector(method:) forControlEvents:UIControlEventTouchUpInside]; 
    if(condition) 
    { 
    cell.btn.hidden=YES; 
    } 
    else 
    { 
    cell.btn.hidden = NO; 
    } 
    return cell; 
} 

не забудьте зарегистрироваться для класса customCell в классе ViewController [TABLENAME registerNib: [UINib nibWithNibName: @ "customCell" пачке: ноль] forCellReuseIdentifier: @ "customCell"];

Вы можете скрыть или отобразить кнопку в соответствии с вашими требованиями, а также добавить различные действия к кнопке в каждом классе. Happy Coding .. !!

Проголосовать, если мой код был полезен для вас ..;)

Смежные вопросы