iOS数据源未按预期设置为TableView

时间:2014-07-24 08:10:47

标签: ios objective-c uitableview datasource

我有TableViewcannedTv”。每个单元格包含另一个TableViewvaluesTv”。 datasource的{​​{1}}结构为cannedTv。对于{ NSString *name, NSArray *valuesArr }valuesArr设置为datasourcevaluesTv是一个可扩展的tableview。最初只显示名称,展开时会显示valuesTv tableView。这是我对tableviews的cannedTvdidSelectRowAtIndexPath委托方法的代码。

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,子表也只显示单个对象数组。现在思考的原因是什么?

1 个答案:

答案 0 :(得分:0)

正如Paulw11所建议的那样,我创建了另一个对象来处理子表的TableViewDelegate和数据源。虽然这对问题的结果没有任何影响。

我设置了UITableViewDelegate&amp;我的顶级表的Cell类中的数据源。将数组传递为表的数据源。

重要的是,在调用

之后设置子表的数据源
[cell.valuesTv reloadData]

强制子表重新加载其数据,最终成功了。直到那时事情都没有奏效。