Iphone UITableView不是';更改数据源后无法正确刷新

Iphone UITableView不是';更改数据源后无法正确刷新,iphone,uitableview,Iphone,Uitableview,我有一个带有多个数据源的UITableView。这是因为,我需要使用UISegmentedControl切换数据,如果我将它们添加为子视图,则无法使用状态栏向上滚动等 首先,我显示一个登录屏幕: self.tableView.dataSource = loginTableView; self.tableView.delegate = loginTableView; [self.tableView reloadData]; 然后,一旦用户登录,我将执行以下操作以更改为SegmentedContr

我有一个带有多个数据源的UITableView。这是因为,我需要使用UISegmentedControl切换数据,如果我将它们添加为子视图,则无法使用状态栏向上滚动等

首先,我显示一个登录屏幕:

self.tableView.dataSource = loginTableView;
self.tableView.delegate = loginTableView;
[self.tableView reloadData];
然后,一旦用户登录,我将执行以下操作以更改为SegmentedController的索引:1,这是他们的配置文件:

self.tableView.dataSource = profileTableView;
self.tableView.delegate = profileTableView;
[self.tableView reloadData];
但是,表视图会更新,但这两个数据源之间有点混合。有些文字已经改变,有些是重叠的,而有些是完全缺失的

是否有其他方法可以更改UITableView的数据源

哇,太奇怪了


上次我这样做时,我只是使用了多个视图,在点击分段控件时隐藏一个视图并显示另一个视图。还有其他可能的解决方案,但这可能是最简单的,也可能是最有效的。

从您发布的代码中不知道为什么会发生这种情况

与其更改委托和数据源,不如将表示所显示数据的ivar替换掉:

- (NSArray*)tableData{

    if(showingLogin)
        return self.loginData;

    return self.profileData;
}

现在您只有1个UITableViewController实例,但有一个BOOL可以告诉您要使用哪个数据源。

表视图正在内部缓存用于显示数据的单元格。因此,如果更改数据源,还应检查is-(UITableViewCell*)tableView:(UITableView*)tableView cellforrowatinexpath:(nsindepath*)indepath方法是否正在将所有单元格更新为正确的新值

根据您的描述,它听起来像是在使用缓存的UITableViewCell实例,而不是在所有情况下都将其更新为正确的新数据。也许是这样的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.frame = CGRectZero;
        cell.textLabel.font = //Set font;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.textLabel.text = @"My Text for this cell"; // <==== Not good! Move it out of this if block
    }
    // Set cell text here
}
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
静态NSString*CellIdentifier=@“Cell”;
UITableViewCell*单元格=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
如果(单元格==nil)
{
cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault重用标识符:CellIdentifier]自动释放];
cell.frame=CGRectZero;
cell.textLabel.font=//设置字体;
cell.selectionStyle=UITableViewCellSelectionStyleNone;

cell.textlab.text=@“我的此单元格文本”/我遇到了完全相同的问题。我的解决方案是隐藏tableView,更改其源,重新加载数据并使tableView再次可见

C#(单触式)中的示例:

tableView.Hidden=true;
tableView.Source=newTableViewSource;
tableView.ReloadData();
tableView.Hidden=false;

我也有同样的问题,您需要做的是在
-(UITableViewCell*)tableView:(UITableView*)tableView cellforrowatinexpath:(nsindepath*)indepath中使用不同的单元格标识符

if (self.segmentedControl.selectedSegmentIndex == 0) {
    self.cellIdentifier = @"segmentOne";
} else {
    caseAtIndexPath = [self.awaitingReviewCaseList caseAtIndex:indexPath.row];
    self.cellIdentifier = @"segmentTwo";
}
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier forIndexPath:indexPath];

我有这个问题,原来是因为我的手机识别码是一样的

static NSString *CellIdentifier = @"Cell";
更改其中一个,并正确设置单元格布局

static NSString *CellIdentifier2 = @"Cell2";

是的,我正在这样做,但是你无法通过状态栏向上滚动,我在推送视图时遇到问题。非常感谢你的帖子,我已经努力更改数据源好几个月了!通过向vc添加属性,确保你在类中对新数据源和委托有强引用。tableview的引用较弱因此,任何局部范围变量都不会停留在这些属性上。