1

У меня есть пользовательский интерфейс, как показано на прилагаемом изображении. Он имеет два компонента: UICollectionView и UITableView.UICollectionView Update Содержимое ячейки для определенной ячейки

enter image description here

То, что я пытаюсь достичь здесь, когда пользователь выбирает любую ячейку из UITableView, я хотел бы обновить Top CollectionViewCell.

Что я сделал до сих пор.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

if(![self.selectedIndexPath isEqual:indexPath]){ 
    UITableViewCell* uncheckCell = [tableView cellForRowAtIndexPath:self.selectedIndexPath]; 
    uncheckCell.accessoryType = UITableViewCellAccessoryNone; 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

} 

UITableViewCell* cellCheck = [tableView cellForRowAtIndexPath:indexPath]; 
cellCheck.accessoryType = UITableViewCellAccessoryCheckmark; 
self.selectedIndexPath = indexPath; 

NSIndexPath *collectionIndex = [NSIndexPath indexPathForItem:0 inSection:self.currentPage]; 
//TODO:Find Correct Cell 
UICollectionViewCell *cellToUpdate = [self.collectionView cellForItemAtIndexPath:collectionIndex]; 

for (UIView *subView in [cellToUpdate.contentView subviews]) { 
    if ([subView isKindOfClass:[CustomView class]]) { 
     CustomView *infoView = (CustomView *)subView; 
     [infoView updateInfoWithIndex:indexPath.row]; 
    } 
} 
[self.collectionView reloadData]; 
} 

Я думаю, что я делаю что-то неправильно здесь, в следующей строке. Не знаете, что?

NSIndexPath *collectionIndex = [NSIndexPath indexPathForItem:0 inSection:self.currentPage]; 
+0

использование делегатов мат. –

ответ

0

Вы должны использовать reloadItems(at indexPaths: [IndexPath]) и просто пройти путь индекса вы заинтересованы. Тогда просто сделать рисунок в методе UICollectionViewDataSource.

0

Я не могу показать вам код для Obj-C, я не коснулся его навсегда. Но этот ответ на вашу проблему должен быть довольно простым. Вам нужно использовать делегатов.

В принципе, идея заключается в следующем: «Что-то было выбрано»

При нажатии на любую ячейку из Tableview, вы стреляете событие, которое говорит.

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

Клетка должна обновляться изнутри. Это ключ.

Итак, что вы делаете, когда вы создаете эти ячейки, они подписываются на это событие (значит, они его слушают), и когда он уволен, они будут реагировать соответственно изнутри.

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

Обратите внимание, что я не уверен, что вы должны отказаться от подписки на эти события (иначе вся ранее созданная ячейка может оставаться в памяти или даже реагировать на событие), так как я действительно не помню, как это работает в obj-c. Я предполагаю, что должен существовать тип события, который принимает только одного абонента, поэтому используйте это, если сможете.

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

Как только вы все это установили, вы золото.

0

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

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

[collectionView performBatchUpdates:^{ 
collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:x section:0]];}]; 

И наоборот, если у вас есть клетки, но хотите, чтобы найти его indexpath вы всегда можете позвонить [collectionView indexPathForCell:myCell]

1

попробуйте этот код, я делаю демо для вас и его рабочий 100%

@IBOutlet var tblview: UITableView! 
    let arrm :NSMutableArray = NSMutableArray() 
    @IBOutlet var collectionview: UICollectionView! 
    var arrayofdata = [ 
    ["image":"2.jpg","title":"Himanshu"], 
    ["image":"1.png","title":"Himanshu"], 
    ["image":"2.jpg","title":"Himanshu"], 
    ["image":"2.jpg","title":"Himanshu"], 
    ["image":"2.jpg","title":"Himanshu"], 
    ["image":"1.png","title":"Himanshu"], 
    ["image":"2.jpg","title":"Himanshu"], 
    ["image":"1.png","title":"Himanshu"], 
    ["image":"2.jpg","title":"Himanshu"], 
    ["image":"2.jpg","title":"Himanshu"], 
    ["image":"2.jpg","title":"Himanshu"],] 

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return arrayofdata.count; 
    } 
    // make a cell for each cell index path 
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("InviteFriendCell", forIndexPath: indexPath) 

     profileimage.image = UIImage(named:arrayofdata[indexPath.row]["image"]!) 
    profileimage.layer.masksToBounds=false 
    if arrm.containsObject("text\(indexPath.row)") { 
     profileimage.layer.cornerRadius = profileimage.frame.size.height/2 
     profileimage.layer.masksToBounds=true 
    } 

     return cell 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 5 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell") 
     cell?.textLabel?.text = "text\(indexPath.row)" 
     return cell! 
    } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     if arrm.containsObject("text\(indexPath.row)") { 

     }else 
     { 
      arrm.addObject("text\(indexPath.row)") 
     } 
     collectionview.reloadData() 
    } 
Смежные вопросы