2011-09-16 105 views
0

我有一个UITableViewController和DetailViewController弹出时,具体行被选中。问题是在DetailViewController中执行旋转时,tableView不会调用“didRotateFromInterfaceOrientation”方法。这是合乎逻辑的,但是如果方向改变了,我需要重新加载表格。如何检测从detailView返回到tableView时的旋转变化?

我想这个代码,但它不工作:

- (void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    if (self.interfaceOrientation != [UIDevice currentDevice].orientation){ 
    [self handleTableViewRotation]; 
    } 
} 

我猜想应该有一些财产持有的tableView的定位是独立当前设备取向财产...

+0

只是为了澄清,视图控制器已做了轮换,只是通知方法(willRotate,didRotate)没有被调用? – jrturton

+0

是的。实际上,这些通知方法没有被调用是合乎逻辑的,因为实际的旋转发生在TBC之外 - 在DetailViewController中。所以,我正在寻求解决这个问题,并且我已经结束了使用@ender提供的第二种解决方案。我在TBC中创建了一个存储tableViewController最后一个方向的属性,并且我使用viewWillAppear方法将它与TBC中的当前设备方向进行了比较。 – Centurion

回答

2

也许最优雅的解决方案是编码一个协议。无论何时您的DetailViewController进入循环回调,请致电reloadData您的tableView的方法。

或...你可以继续这种方式。在这种情况下,您必须将tableViewController的最后方向作为实例var存储并将其与当前值进行比较。之后,记得设置新的方向

编辑:首先宣布一个新的协议。

@protocol RotationDelegate 

    - (void) didRotate; 

@end 

在你DetailViewController.h:

#import RotationDelegate.h 

@interface DetailViewController : UIViewController { 
    id <RotationDelegate> rotationDelegate; 
} 

@property (nonatomic, assign) id <RotationDelegate> rotationDelegate; 

在DetailViewController.m:

@synthesize rotationDelegate; 


-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 

    [rotationDelegate didRotate]; 

} 

现在您的ViewController包含的tableView:

@interface RootViewController : UITableViewController <RotationDelegate> { 
    ... 
} 

最后落实didRotate方法和呼叫[yourTableView reloadData]里面。记住你必须在初始化你的DetailViewController之后设置旋转委托。

+0

我对协议很不熟悉。我这样做,我有时需要包括委托协议和实现方法,但我不知道如何实现您建议的优雅解决方案。你能提供更多细节吗? – Centurion

+0

我已经添加了一些代码,希望这有助于 – ender

+0

感谢@ender :)它看起来像一个协议和旋转委托解决方案类似于具有纯属性(不使用协议)像detailViewController上的“tableViewController”和分配它tableViewController的值。我想这将是一个懒惰的解决方案:)它看起来像实现一个协议是一些工作约定这样的任务。但是非常感谢你清除这个;) – Centurion