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

Posted

技术标签:

【中文标题】当 deviceOrientation 改变时在 UITableView 中重新加载数据【英文标题】:reloadData in a UITableView when deviceOrientation change 【发布时间】:2011-04-14 14:37:34 【问题描述】:

我正在使用 UITableView 和 UITableViewCell。 我的应用支持横向,所以我创建了 2 个 UITableViewCell:一个用于纵向,一个用于横向。

在我的 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)。当我第二次旋转设备时(我处于纵向或倒置状态),我看到了landscape_table_cell(当然,我看不到所有文本,因为它从屏幕上消失了)。 所以.. 除了第一次,我旋转设备的其他时间,我看到了错误的 table_cell_view!!

你知道为什么吗? 谢谢!

【问题讨论】:

【参考方案1】:

您的数据在设备改变方向之前重新加载。 shouldAutorotateToInterfaceOrientation 在任何旋转之前调用。

试试 didRotateFromInterfaceOrientation

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

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

【讨论】:

但是看看@Jhaliya 怎么说。最好让细胞自动适应尺寸。【参考方案2】:

不从shouldAutorotateToInterfaceOrientation调用reloadData:

当您为 UITableViewUITableViewCell 创建对象时,请使用 UIView autoresizingMask 属性。因为UITableView andUITableViewCellare the subclass ofUIView`。

@property(nonatomic) UIViewAutoresizing autoresizingMask

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

获取可见单元格索引

- (NSArray *)indexPathsForVisibleRow

然后用

获取单元格本身

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

并调用类似的方法

[cell interfaceOrientationDidChangeTo:interfaceOrientation]

让工作由细胞自己完成。

【讨论】:

以上是关于当 deviceOrientation 改变时在 UITableView 中重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章

滚动时在标题上添加平滑过渡

如何将 deviceorientation 映射到 MozOrientation 值

NSManagedObjectContext - 当父母改变时如何更新孩子?

在firefox中使用'deviceorientation'事件会发出警告

在手持环境中在移动设备上浏览 Web 时,DeviceOrientation 有多敏感

键盘显示时在 UIViewController 中设置 Tableview y 位置