0

Noobie 所以请多多包涵。

我一直在关注 O'Rielyy Learning iPhone Programming 和这里的各种线程来构建我的第一个 iPhone 应用程序。到目前为止一切顺利,但项目结束的最后一个绊脚石是让应用程序自动旋转(仅使用 uiwebviews 的测试版因不自动旋转而被拒绝)

我有邮件应用程序委托,它添加了一个 UITabBarController

// myNewsUKDelegate.h
@interface myNewsUKDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
    UIWindow *window;
    UITabBarController *tabBarController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@end

// myNewsUKDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Add the tab bar controller's view to the window and display.
    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];
    return YES;
}

tabBarController 有 .h 和 .m 文件 - 我在 IB 中添加了所有 UINavigationControllers,然后又添加了一个 UITableView

请参阅http://flatearth.co.uk/nib.png上的图片(太菜鸟,无法在问题中发布图片!)

从我的阅读中,我了解到问题是我添加到主视图的 UITabBarController 需要“子类化”并添加此代码。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

具有 .h 和 .m 文件的下一个视图向下/进入/子类化(无论正确的术语是什么)是添加表格视图的 FirstViewController,这已经设置了 shouldAutorotateToInterfaceOrientation。

@interface FirstViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
    UITableView *tableView;
    NSArray *userList;
}
@property (nonatomic, retain) IBOutlet UITableView *tableView;
@property (nonatomic, retain) NSArray *userList;
@end

@implementation FirstViewController

@synthesize tableView;

- (void)viewDidLoad {
    [super viewDidLoad];
    // I tried adding
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    // lots of other code ; )
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

所以问题似乎是当 [self.window addSubview:tabBarController.view]; 添加标签栏它不添加 shouldAutorotateToInterfaceOrientation 返回 YES 位。

看来我需要添加一个 tabBarController 子类,其中包含 shouldAutorotateToInterfaceOrientation 。所以我按照互联网上的建议阅读并尝试了这个......

//  tabBarController.h
#import <UIKit/UIKit.h>
@interface tabBarController : UITabBarController {

}
@end

//  tabBarController.m
#import "tabBarController.h"
@implementation tabBarController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
@end

并添加

#import "tabBarController.h"

到 myNewsUKDelegate.m

但这失败了“错误:访问未知的'view'类方法”

[self.window addSubview:tabBarController.view];

myNewsUKDelegate.m 中的行

进一步的搜索并没有产生任何有用的东西,我最近的 Xcode 知识现在已经枯竭:( 任何帮助表示赞赏。

4

2 回答 2

8

从我的阅读中,我了解到问题是我添加到主视图的 UITabBarController 需要“子类化”并添加此代码。

不,你不需要这样做。标签栏控制器通过询问其所有子控制器是否支持该方向来确定它是否支持特定的界面方向。在您的情况下,这些似乎是导航控制器,它们反过来询问它们当前的子控制器是否支持方向。

换句话说,您必须确保所有自定义视图控制器都返回YES所需的界面方向。

于 2011-05-11T18:28:12.120 回答
0

您不需要子类,您需要 UITabBarController 上的类别。基本上,您创建一个名为 UITabBarController + Autoresize.h(和 .m)的文件

在.h中:

#import <UIKit/UIKit.h>

@interface UITabBarController (Autoresize) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;
@end

在他们中:

#import "UITabBarController + Autoresize.h"

@implementation UITabBarController (Autoresize)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{   
    //do custom checks here if you only want to autorotate it in certain views or whatever
}
@end

但正如另一张海报指出的那样,您希望旋转的视图的所有父视图都必须支持旋转。

于 2011-05-11T18:30:14.393 回答