我有一个方案,在UITableViewCell
中选择didSelectRowAtIndexPath:
后,我需要加载并从其他UITableViewCell
获取信息。
我正在注册并使用两个不同的xib作为我的tableViewCells来进行更多自定义。
- (void)viewDidLoad{
[super viewDidLoad];
self.TABLE_ROW_HEIGHT = 66;
self.tblView.delegate = self;
self.tblView.dataSource = self;
[self.tblView registerNib:[UINib nibWithNibName:@"BasicCell" bundle:nil] forCellReuseIdentifier:@"BasicCell"];
[self.tblView registerNib:[UINib nibWithNibName:@"DetailCell" bundle:nil] forCellReuseIdentifier:@"DetailCell"];
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//Property of the view controller which is an IndexPath
self.selectedIndex = indexPath;
BasicModel *basicModel = [self.models objectAtIndex:indexPath.row];
[self.apiClient detailModelSearch:basicModel.id];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
if([self.selectedIndex isEqual:indexPath]){
return 400.0f;
}
return 66.0f;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
BasicModel *basicModel = [self.models objectAtIndex:indexPath.row];
UITableViewCell *tableCell = nil;
if([self.selectedIndex isEqual:indexPath]){
DetailCell *detailCell = [tableView dequeueReusableCellWithIdentifier:@"DetailCell"];
tableCell = detailCell;
}
else{
BasicCell *basicCell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell"];
tableCell = basicCell;
}
return tableCell;
}
-(APIClient *)apiClient{
if(!_apiClient){
_apiClient = [APIClient new];
__weak ViewController *_self = self;
_apiClient.detailModelSearchFinished = ^(DetailModel *detailModel){
_self.detailModel = detailModel;
//Problem is here
DetailCell *cell = [_self.tblView cellForRowAtIndexPath:_self.selectedIndexPath;
dispatch_async(dispatch_get_main_queue(), ^{
[_self.tblView beginUpdates];
[_self.tblView endUpdates];
[_self.tblView reloadData];
});
};
}
return _apiClient;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.models.count;
}
基本结构如下。
接下来会发生什么,因为我知道所触摸的单元格的选定索引路径,我想使用DetailCell而不是BasicCell来呈现来自DetailModel的详细信息。我的问题是我打电话
DetailCell * cell = [_ self.tblView cellForRowAtIndexPath:_self.selectedIndexPath;
我总是收到没有详细视图组件的BasicCell,我需要将detailModel绑定到。
BasicCell xib
细节细胞Xib
表格视图正常:
表格视图扩展了细节Cel xib
答案 0 :(得分:0)
好的,现在很清楚。 我可以想到两种方式,一种是如果你不关心花哨的动画,只需删除(基本)单元格并在同一索引路径上插入一个新的(细节)单元格,只有在你将模型更新为好,并执行最终的类型检查。 快速而肮脏,如果你想要更干净的东西,你可能想要使用polimorfism或其他合适的模式重构模型对象。
另一种方法是使用接收的数据直接更新单元格。您可以应用一些精美的动画,但可能会失去一些表演优势。
答案 1 :(得分:0)
实际上非常简单的解决方案。在我可以获取扩展的单元格之前,必须先调用重新加载数据。这很简单:
[_self.tblView beginUpdates];
[_self.tblView endUpdates];
[_self.tblView reloadData];
DetailCell *expandedCell = (DetailCell *) [_self.tblView cellForRowAtIndexPath:_self.selectedIndex];
expandedCell.lblData.text = @"IT WORKS!";
});