как скрыть/показать определенное представление внутри пользовательской ячейки таблицы при нажатии кнопки внутри той же ячейки

  • У меня есть table view с (например: 20 строк). и я использовал custom table view cell с этим table view.

  • внутри этого table view cell есть несколько labels, один button и hidden view (UIView).

  • Я написал button action для hide/show hidden view внутри custom table view cell class. Он работает нормально, но влияет на другие rows в табличном представлении. это означает, что когда я нажимаю кнопку в первой строке, отображается скрытое представление, и оно может видеть некоторые другие строки в представлении таблицы, когда scroll down.

  • В то же время (когда hide/show) я хочу increase и decrease высоту строки (только щелкнутая строка/ячейка). что идет не так. ниже мои коды и несколько снимков экрана, чтобы получить представление.

это первая строка при нажатии кнопки

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

Примечание: ячейка расширяется/увеличивается сама при нажатии кнопки расширения в каждой ячейке.

вот как я hide и show hidden view внутри класса custom table view cell.

- (IBAction)hideshow:(id)sender {
    BOOL ishidden = self.insideCollectionView.hidden;
    if(ishidden == true)
    {
        self.insideCollectionView.hidden = false;
    }
    else
    {
        self.insideCollectionView.hidden = true;
    }
}

что происходит не так, надеюсь, ваша помощь с этим.

Дополнительно: было бы здорово, если бы был способ скрыть/показать и развернуть (увеличить высоту строки) ячейки при нажатии кнопки расширения для каждой ячейки.


person Chanaka Anuradh Caldera    schedule 14.09.2016    source источник
comment
Почему вы не используете один UICollectionView с опцией expand в CollectionViewHeaders? Менее сложный код, и для скрытия/расширения вы можете реализовать метод numberOfCellsInRow, чтобы соответственно установить строку с count на 0, и даже анимировать это.   -  person Aerows    schedule 14.09.2016


Ответы (7)


Нашел подходящее решение для этого самостоятельно. Спасибо всем, кто меня поддержал.

Выполните следующие действия.

  1. Создайте NSMutableArray для хранения Which button в Which row clicked.
  2. Затем, когда пользователь нажимает на Button в Custom table view cell, проверьте, что index path является already в mutable array, если внутри него already, то romove, в противном случае добавьте его.
  3. Затем в методе cellforrowatindexpath проверьте, что nsmutable array и , проверьте, является ли indexpath.row exist или not.
  4. Наконец, если это exists, не скрывайте, иначе hide это работает отлично.

вот реализация табличного представления. .m файл

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    FirstTableViewCell *cells = [tableView dequeueReusableCellWithIdentifier:@"tvcell" forIndexPath:indexPath];

    NSString *theIndexpath = [NSString stringWithFormat:@"%ld", (long)indexPath.row];

//here check whether it is exists or not.
        if ([chekcme containsObject:theIndexpath])
        {
            cells.insideCollectionView.hidden = false;
        }
        else
        {
            cells.insideCollectionView.hidden = true;
        }



    [cells setColletionData:bbarray];

    [cells.expandMe addTarget:self action:@selector(runs:) forControlEvents:UIControlEventTouchUpInside];

//in here set the tag of the button to indexpath.row
    cells.expandMe.tag = indexPath.row;


    return cells;
}

//this is the action for the button inside the custom tableview cell.
- (IBAction)runs:(UIButton *)sender{

    NSString *myob = [NSString stringWithFormat:@"%li", (long)sender.tag];
    NSLog(@"%@",myob);

    if ([chekcme containsObject:myob]) {
        [chekcme removeObject:myob];
    }
    else
    {
        [chekcme addObject:myob];
    }


    NSLog(@"%@", chekcme);

//keep in mind to reload the table view here.
    [self.maintableView reloadData];
}

Примечание: checkme — это NSMutableArray для хранения объектов, на которые нажал пользователь.

person Chanaka Anuradh Caldera    schedule 14.09.2016

Мне нужно будет увидеть код в ваших методах источника данных tableview, но я думаю, что следующее может решить ваши проблемы:

Проблема № 1: я предполагаю, что вы используете deque для своей ячейки, это приводит к повторному использованию ячейки при прокрутке. Я предлагаю вам сохранить состояние каждой вашей ячейки (например, isExpanded) и соответствующим образом настроить ячейку в cellForRowAtIndex:

Проблема № 2: используйте тот же «IsExpanded» в heightForRowAtIndex: и вызовите reloadRowsAtIndexPaths: в таблице для вашей ячейки, когда состояние изменено на «IsExpanded»

person Vaibhav Misra    schedule 14.09.2016

То, что кнопка влияет на несколько rows, связано с тем, что вы сохраняете BOOL в collectionView в cell.

Когда cell повторно используется для другого row, этот cell будет hidden/shown в зависимости от статуса row, для которого он ранее использовался. Как уже было предложено, вам нужно сохранить этот state для каждого из ваших rows и установить его соответствующим образом, когда cell будет подготовлен dataSource.

person Aerows    schedule 14.09.2016

Первоначально вы должны установить статус представления в cellForRowAtIndexPath. Надеюсь, это поможет вам.

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

// here you have to maintain the status about the current cell. whether it is hidden or not.
    cell.insideCollectionView.hidden = status;
    }
person Vishnuvardhan    schedule 14.09.2016
comment
как вы это называете с self, потому что insideCollectionView находится внутри моего custom table view cell, - person Chanaka Anuradh Caldera; 14.09.2016
comment
не могли бы вы объяснить бит с кодом, буду признателен. - person Chanaka Anuradh Caldera; 14.09.2016
comment
Я хотел сказать, что в cellForRowAtIndexPath у нас есть ссылка на ячейку, верно? с этим вы можете контролировать скрытие. - person Vishnuvardhan; 14.09.2016

Я делаю то же самое, например: в didSelect

  switch selectedIndexPath {
    case nil:
        selectedIndexPath = indexPath
    default:
        if selectedIndexPath! == indexPath {
            selectedIndexPath = nil
        } else {
            selectedIndexPath = indexPath
        }
    }
  tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

И на высоте строки

if selectedIndexPath != nil {
        if selectedIndexPath == indexPath {
            return estimatedHeight
        }
    }
    return 44

selectedIndexPath является свойством NSIndexPath. Надеюсь, это поможет вам.

person Prabhat    schedule 14.09.2016
comment
да, это может быть сделано, если я хочу сделать с выбранной строкой в ​​индексном пути, но я хочу сделать это при нажатии кнопки, потому что я хочу использовать выбранную строку в индексном пути для перехода к другому представлению. - person Chanaka Anuradh Caldera; 14.09.2016
comment
да, вы тоже работаете с кнопкой, установив для них тег. - person Prabhat; 14.09.2016

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

 tbl_name .beginUpdates(
 tbl_name .endUpdates()

Обновить

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

   if indexPath.row == userselectedrow // save selectecd cell index  if you want to only one cell expand otherwise save selected row in array and compare to here
        {
             return incrementheight // increment row height here
        }
        else
        {
          return decrementheight // decrement row height
        }      

    }

- (IBAction)hideshow:(UIButton*)sender {
 CGPoint point11=[sender convertPoint:CGPointZero toView:tbl_calender];
   NSIndexPath index_pathGlobal =[tbl_calender indexPathForRowAtPoint:point11]; // save index_pathGlobal
}

надеюсь, это поможет вам

person kirti Chavda    schedule 14.09.2016
comment
как его использовать, я не знаю, как его использовать и где его использовать. - person Chanaka Anuradh Caldera; 14.09.2016
comment
в вашем действии кнопки нажмите и увеличьте высоту строки, которую вы хотите расширить, и другую высоту строки, которую вы хотите уменьшить - person kirti Chavda; 14.09.2016
comment
Можете ли вы немного объяснить с необходимым кодом, буду признателен. спасибо заранее - person Chanaka Anuradh Caldera; 14.09.2016
comment
как я могу сохранить выбранную строку, потому что я хочу сделать это для нажатия кнопки внутри ячейки, а не для выбора строки по пути индекса, потому что я хочу перейти к другому контроллеру, когда пользователь нажимает на строку. - person Chanaka Anuradh Caldera; 14.09.2016
comment
проверить обновления, ответить, получить индексный путь, нажав кнопку - person kirti Chavda; 14.09.2016

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

Шаг 2: - После этого в действии кнопки вы передаете indexPath.row как значение тега в ячейке для строки в пути индекса, поэтому при действии кнопки измените параметр vale массива isViewNeedToShow == TRUE и перезагрузите раздел табличного представления. Например: -

Item *tempItem              = yourArray[sender.tag];
tempItem. isViewNeedToShow  = tempItem. isViewNeedToShow ? FALSE : TRUE;

**For particular row update** :- 

 [yourTableView beginUpdates];
 [yourTableView reloadRowsAtIndexPaths:@[sender.tag, 0] withRowAnimation:UITableViewRowAnimationNone];
 [yourTableView endUpdates];

Шаг 3. Если вы хотите расширить ячейку таблицы, вам необходимо рассчитать высоту строки, содержащей такие элементы, как вид, метка и т. д.

Or if you are using auto layouts in your project use UI Table View Delegate Methods

    -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
        return UITableViewAutomaticDimension;
    }

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        return UITableViewAutomaticDimension;
    }

Я надеюсь, что ваша проблема будет решена.

person Prabhat Pandey    schedule 14.09.2016