当deviceOrientation改变时,在UITableView中重新加载数据

时间:2011-04-14 14:37:34

标签: iphone uitableview landscape

我正在使用带有UITableViewCell的UITableView。 我的应用程序支持横向,所以我创建了2个UITableViewCell:一个用于portraid,另一个用于景观。

在我的cellForRowAtIndexPath方法中,这是我的代码

static NSString *CellIdentifier;
static NSString *NibNamed;

UIDeviceOrientation deviceOrientation = [UIApplication sharedApplication].statusBarOrientation;

if (deviceOrientation != UIDeviceOrientationLandscapeLeft &&
    deviceOrientation != UIDeviceOrientationLandscapeRight)
{
    CellIdentifier= @"Cell1";
    NibNamed = @"cell_news";
}
else
{
    CellIdentifier= @"Cell2";
    NibNamed = @"cell_news_landscape";
}

[[NSBundle mainBundle] loadNibNamed:NibNamed owner:self options:NULL];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:NibNamed owner:self options:nil];
    cell = [nib objectAtIndex:0];
}
///here i add title, description, ecc... in my UITableViewCell

然后在shouldAutorotateToInterfaceOrientation中我写了这个:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
[my_table reloadData];
return YES;
}

问题出在哪里? 如果我以纵向启动应用程序,当我第一次旋转设备时,没有任何事情发生(并且UITableCellView是portrait_table_cell)。当我第二次旋转设备时(我是在纵向或在upsideDown中),我看到landscape_table_cell(当然,我没有看到所有文本,因为它从屏幕上消失)。 所以..除了第一次,其他时间我旋转设备,我看到错误的table_cell_view !!

你知道为什么吗? 谢谢!

4 个答案:

答案 0 :(得分:9)

您的数据会在设备更改方向之前重新加载。 在任何轮换之前调用shouldAutorotateToInterfaceOrientation。

尝试didRotateFromInterfaceOrientation

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
 [my_table reloadData];
}

还要注意Jhaliya给出的答案,因为解决方案会比重新加载tableview更好。 如果数据源已更改,则只应重新加载tableview。

答案 1 :(得分:4)

不从shouldAutorotateToInterfaceOrientation调用reloadData:

为两者创建对象时,请为autoresizingMaskUITableView使用UIView UITableViewCell属性。因为UITableView and UITableViewCell are the subclass of UIView`。

@property(nonatomic) UIViewAutoresizing autoresizingMask

答案 2 :(得分:0)

我认为有两个问题。 1)在视图旋转之前调用shouldAutoRotateToInterfaceOrientation,因此如果你刷新,那就太早了。  2)我认为你需要自己管理重绘而不是依赖reloadData。因此要么覆盖tableViewCell的重绘方法,要么适当地设置自动调整大小的掩码。希望这可以帮助。 -Mike

答案 3 :(得分:0)

如果自动调整不适合您,您还可以使用

获取可见单元格索引

- (NSArray *)indexPathsForVisibleRow

然后用

获取细胞

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath

并调用类似

的方法

[cell interfaceOrientationDidChangeTo:interfaceOrientation]

让工作由细胞本身完成。