我有UI,如附图所示。它有两个组件,主要是UICollectionView和UITableView。
当用户从UITableView中选择任何单元格时,我想要实现的目标,我想更新Top CollectionViewCell。
到目前为止我做了什么。
function playAudio{
self.songChanged = false;
setTimeout(function() {
self.songChanged = true;
$scope.$apply();
}, 10);
}
我认为我在接下来的行中做错了。不确定是什么?
- (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];
}
答案 0 :(得分: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()
}
答案 1 :(得分:0)
您应该使用reloadItems(at indexPaths: [IndexPath])
并只传递您感兴趣的索引路径。然后只需使用UICollectionViewDataSource
方法进行绘制。
答案 2 :(得分:0)
我无法向您展示Obj-C的代码,我没有永远触及过它。但是你的问题的答案应该相当简单。你需要使用代表。
基本上,这个想法如下:
当你点击tableview中的任何单元格时,你会触发一个“选择了某个东西!”的事件。
从观点或您的桌面视图来看,这是应该知道的一切。你不能让tableview知道上面有一个集合视图,当然也不是外面的单元格内容。
细胞必须从内部更新自己。这是关键。
所以你所做的就是,当你创建那些单元格时,他们会订阅那个事件(意思是,他们会听到它),当它被触发时,它们会从内部作出相应的反应。
由于只有一个单元格可见,并且只有一个单元格应该订阅,因此很容易做到,您只需在cellforrow中订阅,并且将作出反应的单元格将始终正确。如果没有,你将不得不使用索引路径。
请注意,我不确定您是否应该取消订阅这些事件(否则所有先前创建的单元格可能会保留在内存中,甚至仍然会响应该事件)因为我真的不记得这是如何工作的OBJ-C。我猜测应该有一个只接受一个订阅者的事件类型,所以如果可以,请使用它。
如果您的单元格需要来自外部的数据,您可以在触发之前将参数传递给事件,在cellSelected中。
一旦你完成所有这些,你就是金。
答案 3 :(得分:0)
这取决于您的实现,如何将单元格分组为多个部分,但假设您有一个部分,并且数组中的每个元素都对应于表格中的一行。
如果你想在索引x
重新加载对应于数组元素的单元格,你需要做的就是写
[collectionView performBatchUpdates:^{
collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForRow:x section:0]];}];
相反,如果您有单元格但想要找到其索引路径,则可以随时调用[collectionView indexPathForCell:myCell]