Как сделать, чтобы UIButton отображался только в последней ячейке?

#ios #objective-c #uitableview #uibutton

#iOS #objective-c #uitableview #uibutton

Вопрос:

Я довольно новичок в программировании Objective C, и у меня есть настройка UITableView с пользовательской ячейкой. Я хочу сделать так, чтобы пользователь мог нажать кнопку, которая добавит еще одну ячейку, и эта кнопка появится только в последней ячейке. В настоящее время он не отображается. Вот код, который я использую. Я создал кнопку внутри пользовательской ячейки и использовал «setHidden: YES», чтобы скрыть ее внутри самой ячейки. Я пытаюсь «setHidden: NO», чтобы кнопка отображалась в коде TableView, но это не работает. Я подумал, может быть, это как-то связано с перезагрузкой ячейки, но я не уверен, двигаюсь ли я в правильном направлении с этим или нет. Я был бы признателен за любую помощь в этом, спасибо.

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

// Configure the cell...
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[cell.addButton setTitle:(NSString *)indexPath forState:UIControlStateApplication];
[cell.textLabel setText:[NSString stringWithFormat:@"Row %i in Section %i", [indexPath row], [indexPath section]]];

NSInteger sectionsAmount = [tableView numberOfSections];
NSInteger rowsAmount = [tableView numberOfRowsInSection:[indexPath section]];

if ([indexPath section] == sectionsAmount - 1 amp;amp; [indexPath row] == rowsAmount - 1) {
    NSLog(@"Reached last cell");
    [cell.addButton setHidden:NO];
    if (lc == NO)
    {[[self tableView] reloadData];
        lc = YES;
    }
}

 return cell;
 }
  

Комментарии:

1. зачем вы перезагружаете таблицу в cellForRowAtIndexpath ?

2. Лучший способ сделать это — добавить свою кнопку в вид нижнего колонтитула таблицы.

Ответ №1:

Следующий UITableViewDataSource метод поможет вам вернуть точное количество строк, доступных в разделе. Здесь вам нужно вернуть дополнительный, поскольку вы хотите, чтобы ваша кнопка была последней.

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return yourRowCount   1;
}
  

Теперь в следующем методе вы будете проверять номер строки, используя indexpath.row как

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *lastCellIdentifier = @"LastCellIdentifier";
    static NSString *workoutCellIdentifier = @"WorkoutCellIdentifier";

    if(indexPath.row==(yourRowCount 1)){ //This is last cell so create normal cell
        UITableViewCell *lastcell = [tableView dequeueReusableCellWithIdentifier:lastCellIdentifier];
        if(!lastcell){
            lastcell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:lastCellIdentifier];
            CGRect frame = CGRectMake(0,0,320,40);
            UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom];
            [aButton addTarget:self action:@selector(btnAddRowTapped:) forControlEvents:UIControlEventTouchUpInside];
            aButton.frame = frame;
            [lastcell addSubview:aButton];
        }
        return lastcell;
    } else { //This is normal cells so create your worktouttablecell
        workoutTableViewCell *cell = (workoutTableViewCell *)[tableView dequeueReusableCellWithIdentifier:workoutCellIdentifier];
        //Configure your cell

    }
}
  

Или вы можете сделать, например, создать UIView программно и установить его в качестве нижнего колонтитула, как предложено @student в комментарии, код будет выглядеть следующим образом,

 CGRect frame = CGRectMake(0,0,320,40);
UIView *footerView = [[UIView alloc] initWithFrame:frame];
UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom];
[aButton addTarget:self action:@selector(btnAddRowTapped:) forControlEvents:UIControlEventTouchUpInside];
aButton.frame = frame;
[footerView addSubView:aButton];
[yourTableNmae setTableFooterView:footerView];
  

Объявите метод следующим образом

 -(IBAction)btnAddRowTapped:(id)sender{
    NSLog(@"Your button tapped");
}
  

Комментарии:

1. пожалуйста, отредактируйте метод cellForRowAtIndexPath также в вашем ответе. Это поможет ему больше. Потому что он неправильно выделил ячейку и не выполнил условие else. Спасибо @Janak

Ответ №2:

 if ([indexPath section] == sectionsAmount - 1 amp;amp; [indexPath row] == rowsAmount - 1) {
    NSLog(@"Reached last cell");
    [cell.addButton setHidden:NO];
} else { 
    [cell.addButton setHidden:YES];
}
  

Замените этот код в вашей программе.

Ответ №3:

Если вы знаете количество ячеек в пользовательском файле и хотите просто узнать, когда появится последняя строка, вы могли бы реализовать следующий метод делегирования

  • (недействительный)TableView: (UITableView *)TableView отобразит ячейку: (UITableViewCell *)ячейку forRowAtIndexPath: (NSIndexPath *)indexPath

этот метод сообщает, что представление делегированной таблицы собирается отобразить ячейку для определенной строки, просто сравните вашу строку с таблицей rowcount.