1

我有UI,如附圖所示。它有兩個組件,主要是UICollectionView和UITableView。UICollectionView更新特定單元格的單元格內容

enter image description here

我試圖當用戶從任何的UITableView細胞在這裏實現,我想更新頂部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中的任意單元格,你火,說的事件。

從視角或你的tableview來看,這就是知道的一切。你不能讓桌面視圖知道上面有一個collectionview,當然不是從外面看它的單元格的內容。

單元必須從內部更新自己。這是關鍵。

所以,你要做的就是,當你創建這些細胞,他們訂閱的事件(手段,他們聽的話),而當它被解僱,他們會從裏面做出相應的反應。

由於只有一個細胞可見,只有一個應該訂閱,它很容易做到的細胞,你只要在訂閱和cellforrow將作出反應,細胞永遠是正確的。如果不是,你將不得不使用索引路徑。

請注意,我不確定是否應該取消訂閱這些事件(否則所有先前創建的單元格可能會留在內存中,或者甚至仍然對事件做出響應),因爲我不記得這是如何工作的在obj-c中。我猜應該有一個只接受一個用戶的事件類型,所以如果可以的話就使用它。

如果您的單元以某種方式需要來自外部的數據,則可以在cellSelected中將參數傳遞給事件之前將其傳遞給該事件。

一旦你把所有這些設置好了,你就是金子。

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() 
    } 
相關問題