gpt4 book ai didi

iOS:不为 UICollectionView 中包含的 UITableView 调用 cellFowRow

转载 作者:可可西里 更新时间:2023-11-01 06:15:14 24 4
gpt4 key购买 nike

我的应用程序包含一个 UICollectionView,其中每个单元格都包含一个 UITableView。 TableView 的行数方法被正确调用,但 cellForRow 方法从未被调用。相关代码如下:

设置 TableView (在 View 中加载):

[self.collectionView registerNib:[UINib nibWithNibName:@"OrganizationCollectionCell" bundle:nil] forCellWithReuseIdentifier:@"OrganizationCollectionCell"];


tableViews = [[NSMutableArray alloc] initWithCapacity:recipOrgs.count];

for (NSDictionary *orgDict in recipOrgs) {

int index = [recipOrgs indexOfObject:orgDict];


OrganizationTableView *tableView = [[OrganizationTableView alloc] initWithFrame:collectionView.frame];

tableView.index=index;
tableView.parentCon=self;
tableView.dataSource=tableView;
tableView.delegate=tableView;

[tableViews addObject:tableView];

}

CollectionView 的 cellForItem:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"cellForItem CollectionView");
OrganizationCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"OrganizationCollectionCell" forIndexPath:indexPath];

if (cell==nil) {
NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"OrganizationCollectionCell" owner:self options:nil];
cell = [objects objectAtIndex:0];
}

OrganizationTableView *tv = [tableViews objectAtIndex:indexPath.row];
if (tv.orgAlerts==nil) {
[tv getAlerts];
}

cell.tableView=tv;
cell.tableView.frame=collectionView.frame;
NSLog(@"%f %f",cell.tableView.frame.size.height,cell.tableView.frame.size.height);

return cell;

}

“getAlerts”方法:

-(void)getAlerts{

orgAlerts = [[NSArray alloc] init];
NSString *orgID = [[parentCon.recipOrgs objectAtIndex:index] objectForKey:@"id"];

[[EDAPIStore sharedStore] getAlertsForOrganizationWithID:orgID WithCompletion:^(NSArray *alerts, NSError *error) {

if (alerts) {

orgAlerts = alerts;
[self reloadData];
}else{
NSLog(@"%@",error.localizedDescription);
}

}];
}

OrganizationTableView 的 numberOfRowsMethod:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSLog(@"number of rows");
NSLog(@"orgAlerts.count: %d",orgAlerts.count);
if (orgAlerts.count==0) {

return 1;
}else{
return orgAlerts.count;
}

我已验证 numberOfRows 返回了正确的数字(大约 30),但从未调用 cellForRow 方法。集合单元格和表格 View 单元格都在它们自己的 xib 中定义。

最佳答案

与其在 View Controller 的 viewDidLoad 中设置 TableView 的 dataSourcedelegate,不如在 collectionView:cellForItemAtIndexPath: 方法,在 UICollectionViewCell 中获取对 UITableView 的引用,并在那里设置它的 dataSourcedelegate .对于任何带有委托(delegate)的 View ,这似乎是在 iOS 中执行此操作的方式,并且被放置在 UITableViewCellUICollectionViewCell 中。因此,如果您发现自己使用 UITableViewController 构建表单,其中您在 UITableView 中有 UITextField,请在 cellForRowAtIndexPath 中设置文本字段委托(delegate): 方法。

我还可以补充一点,在您的 Collection View 单元格中保留对所有 UITableView 的强引用可能会占用大量内存。您的 Collection View 可能正在重用“原型(prototype)” Collection View 单元格,而不是已自定义为内部有一个 UITableView。然后,在您的 View Controller 中,保留一个二维 NSArray 作为 Collection View 的数据源。第一个维度用于您的 Collection View ,第二个维度用于每个 TableView 的数据源。

关于iOS:不为 UICollectionView 中包含的 UITableView 调用 cellFowRow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22560429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com