我有TableView
“cannedTv
”。每个单元格包含另一个TableView
“valuesTv
”。 datasource
的{{1}}结构为cannedTv
。对于{ NSString *name, NSArray *valuesArr }
,valuesArr
设置为datasource
。 valuesTv
是一个可扩展的tableview。最初只显示名称,展开时会显示valuesTv tableView。这是我对tableviews的cannedTv
和didSelectRowAtIndexPath
委托方法的代码。
cellForRowAtIndexPath
我遇到的问题是,每次-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"ROW Selected...TAG = %d", tableView.tag);
selectedValueIndex = -1;
if (tableView == self.cannedTV) {
// USer taps expanded row
if (selectedIndex == indexPath.row) {
selectedIndex = -1;
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath ] withRowAnimation:UITableViewRowAnimationFade];
return;
}
// USer taps differnt row
if (selectedIndex != -1) {
NSIndexPath *prevPath = [NSIndexPath indexPathForRow:selectedIndex inSection:0];
selectedIndex = indexPath.row;
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:prevPath] withRowAnimation:UITableViewRowAnimationFade];
}
// User taps new row with none expanded
selectedIndex = indexPath.row;
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
return;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Table View TAG = %d ROW = %d", tableView.tag, indexPath.row);
if (tableView.tag == 10) { // cell.valuesTv
CannedValueCell *ccell = (CannedValueCell *) [tableView dequeueReusableCellWithIdentifier:@"cannedValueCell"];
if (ccell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CannedValueCell" owner:self options:nil];
ccell = [nib objectAtIndex:0];
}
// Populate valuesTv
ccell.valueTextView.text = [valuesArray objectAtIndex:indexPath.row];
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(valueTextViewTapped)];
[ccell.valueTextView addGestureRecognizer:gestureRecognizer];
//[ccell.valueTextView sizeToFit];
return ccell;
} else {
// cannedTv
static NSString *cellIdentifier = @"CannedCell";
cell = (CannedCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CannedCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
// Set Datasource & Delegate for valuesTv tableview
cell.valuesTv.dataSource = self;
cell.valuesTv.delegate = self;
if (selectedIndex == indexPath.row) {
// Do expanded cell stuff
[cell.tapInsertLbl setFont:[UIFont fontWithName:@"OpenSans" size:8.0]];
cell.tapInsertLbl.hidden = FALSE;
[cell.contentView setBackgroundColor:[UIColor lightGrayColor]];
[cell.contentView.layer setBorderColor: (__bridge CGColorRef)([UIColor redColor])];
[cell.contentView.layer setBorderWidth:1.0f];
} else {
// Do closed cell stuff
cell.tapInsertLbl.hidden = TRUE;
cell.contentView.backgroundColor = [UIColor whiteColor];
}
if (tableView == self.cannedTV) {
valuesArray = nil;
CannedItem *ci = [candRespList objectAtIndex:indexPath.row];
cell.tagLbl.text = ci.name;
// Set the valuesArray so it be used in populating the valuesTv
valuesArray = [NSMutableArray arrayWithArray: ci.valuesArr];
ci = nil;
} else if (tableView == self.searchDisplayController.searchResultsTableView) {
cell.tagLbl.text = [searchResults objectAtIndex:indexPath.row];
}
[cell.tagLbl sizeToFit];
return cell;
}
}
显示正确datasource
时。此时我在valuesArray中有2个数组,第0个元素有1个对象,第1个元素有3个对象(NSString)。 valuesTv
Datasource
也有2行。有时,有一次cannedTv
行显示正确的数据源,然后两个都显示相同的数据源。有时,两行都显示相同的数据源。我不明白为什么canndTv
无法获得正确的数据源。在进行调试时,我发现有时候valuesArray
有正确的数据源,但是tableview显示错误,有时控件没有转到valuesArray
行,因此之前设置的// Populates valuesTv
只是所示。我尝试了很多方法,但无法按预期得到结果。设置valuesArray
后,还尝试在valuesArray
设置didSelectRowAtIndexPath
,但这也无济于事。
我从昨天开始就被困在这里,无法通过。由于哪些正确的数据源未在tableviews上显示/反映,我在哪里出错。你能帮我试试吗?任何帮助都非常感谢。非常感谢。
更新: -
创建新的数据源&委托selectedIndex
对象本身 - 它包含CannedCell
。
valuesTv
在我的VC中,删除了@interface CannedCell : UITableViewCell <UITableViewDataSource, UITableViewDelegate>
@property NSArray *valuesDataSource; // Contains the valuesArray contents
&amp;的数据源。 cell.values.datasource
行。在top表的cell.valuesTv.delegate
方法中,像这样设置数据源: -
cellForRowAtIndexPath
在 if (tableView == self.cannedTV) {
valuesArray = nil;
CannedItem *ci = [candRespList objectAtIndex:indexPath.row];
cell.tagLbl.text = ci.name; //[tagsArray objectAtIndex:indexPath.row];
//valuesArray = [NSMutableArray arrayWithArray: ci.valuesArr];
cell.valuesDataSource = ci.valuesArr; // SET DATASOURCE
// This is setting proper array always
ci = nil;
}
方法中对整个if (tableView.tag == 10) {
进行了评论。
在CannedCell中: -
cellForRowAtIndexPath
}
然而结果只是早些时候。我的意思是即使将3个对象的数组设置为valuedDataSource,子表也只显示单个对象数组。现在思考的原因是什么?
答案 0 :(得分:0)
正如Paulw11所建议的那样,我创建了另一个对象来处理子表的TableViewDelegate和数据源。虽然这对问题的结果没有任何影响。
我设置了UITableViewDelegate&amp;我的顶级表的Cell类中的数据源。将数组传递为表的数据源。
重要的是,在调用
之后设置子表的数据源[cell.valuesTv reloadData]
强制子表重新加载其数据,最终成功了。直到那时事情都没有奏效。