在UITableview中水平滚动UICollectionView

时间:2013-07-24 22:57:12

标签: delegates uicollectionviewcell uitableview

我创建了一个UItableView,每个表格单元格都是一个UICollectionView。我的视图控制器是UITableView和UICollectionView的委托和数据源。

tableView的行数取决于填充数组的异步请求。 UICollectionView中位于表格单元内的单元格数也是异步确定的。

所以基本上,每次我添加到驱动tableview中行数的数组时 - 我都在调用[tableView reloadData];

反过来触发每个单元格重新加载。在每个单元格中,我将UICollectionView的委托设置为控制器,并调用[UICollectionView reloadData]来刷新UICollectionView。 UICollectionView中的单元格正在下载也发生异步的图像。

我的问题是,有什么更优雅的方法可以做到这一点?

我的代码如下

- (void)viewDidLoad
{

    [self.featuresTableView setDelegate:self];
    [self.featuresTableView setDataSource:self];

}

我的viewController具有通过调用许多异步请求创建的对象的观察者。所以我在对象上设置了一个KVO

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if([keyPath isEqualToString:@"completedSpotSetup"]){
CustomClass * customObject = ((CustomClass*) object);
if(customObject.isValidPropertySet){
NSString *fcode = [customObject.dictionary objectForKey:@"code"];
NSMutableArray * myArray = [self.myTableRowArrayDictionary objectForKey:fcode];
    if (myArray == nil) {
                featureArray = [[NSMutableArray alloc] init];
                [self.myTableRowArrayDictionary setObject:featureArray forKey:fcode];
                [self.myTableView reloadData];
            }
[myArray addObject:customObject];
}
}

接下来在我的

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [[[self.myTableRowArrayDictionary keyEnumerator] allObjects] count];
    }

And in the datasource for cell

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        static NSString *cellIdentifier = @"featureCell";
        FeatureTableRowCell *cell = (FeatureTableRowCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

        if (cell.tableCellCollectionView.delegate == nil ) {
            [cell.tableCellCollectionView setDelegate:self];
            [cell.tableCellCollectionView setDataSource:self];
            cell.tableCellCollectionView.tag = indexPath.row;
        }
        [cell.tableCellCollectionView reloadData];
        return cell;

    }

The controller further implements the UICollectionView datasource to determine the number of cells and data for each cell as follows

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    NSString * fcode = [self.interestsToSearch objectAtIndex:collectionView.tag];
    NSArray * myArray = [self.myTableRowArrayDictionary objectForKey:fcode];
    return [myArray count];
}






    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
        NSString * fcode = [self.interestsToSearch objectAtIndex:collectionView.tag];
            NSArray * myArray = [self.myTableRowArrayDictionary objectForKey:fcode];

        static NSString *cellIdentifier = @"collectionCell";
            UICollectionViewCell *cell = (UICollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

        dispatch_queue_t loaderQ = dispatch_queue_create("flickrImageLoader", NULL);
            dispatch_async(loaderQ,^{

             // Do Something

           });
        return cell;
        }

这样做会导致VREY BAD表现不佳并且效果不佳。

我错过了什么?我认为放置一个在tableview中水平滚动的UICollectionView是合法的。如果我不知道UITableView将拥有多少行以及当我开始显示表时UICollectionView将具有多少单元格,那么最好的方法是什么?当互联网请求得到解决时,所有这些都是异步确定的。

任何人都可以对这样一个长期的问题有一些耐心并帮助我吗???

0 个答案:

没有答案