19

iPhone専用アプリケーションをユニバーサルアプリケーションに変換しようとしています。デバイスをユニバーサルに切り替えて、XcodeにMainWindow-iPad.xibを作成させました。これで、iPhoneシミュレーターでアプリを実行すると正常に動作しますが、iPadシミュレーターで実行すると白になります。画面とApplication windows are expected to have a root view controller at the end of application launchエラー。私はこの同じ問題について他のいくつかの投稿を読みましたが、それらのどれもただ1つのデバイスに限定されていません。

これが私のapplication:didFinishLaunchWithOptions:方法です:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

 /* some dropbox setup stuff */


// INIT VIEW AND CORE DATA
RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];

NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
    // Handle the error.
}

rootViewController.managedObjectContext = context;

UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
self.navigationController = aNavigationController;

[_window addSubview:[_navigationController view]];
[_window makeKeyAndVisible];

[rootViewController release];
[aNavigationController release];

return YES;
}

編集:私は、RootViewControllerと呼ばれるiPhone用のサイズのルートビューコントローラーを1つだけ持っています。しかし、それでもロードする必要がありますね。または、iPad用に作成する方法がない場合はどうすればよいですか?

4

5 に答える 5

52

次の行を変更します。

[_window addSubview:[_navigationController view]];

に:

_window.rootViewController = _navigationController;

または、iOS 3との互換性が必要な場合:

if ([_window respondsToSelector:@selector(setRootViewController:)]) {
    _window.rootViewController = _navigationController;
} else {
    [_window addSubview:_navigationController.view];
}
于 2012-01-03T01:05:29.860 に答える
2

iPad用のxibファイルを使用してRootViewControllerを作成する必要があります。そうしないと、このエラーが発生します。以下は、ユニバーサルアプリ用にXcodeが提供するテンプレートコードです。iPadシミュレーターでアプリをデバッグし、実行するデバッガーを指定して、iPhone xibファイルを使用してViewControllerを作成すると、正確なエラーが表示されます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.viewController = [[SYKViewController alloc] initWithNibName:@"SYKViewController_iPhone" bundle:nil];
    } else {
        self.viewController = [[SYKViewController alloc] initWithNibName:@"SYKViewController_iPad" bundle:nil];
    }
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
于 2012-01-03T03:30:01.330 に答える
2

iOS 4以降でUIWindowは、settableプロパティがありますrootViewController。これは、アプリケーションの起動時に表示されるUINavigationControllerものをプッシュするものです。UIViewControllerXcode IBで、[初期シーン:初期ビューコントローラー]を選択UINavigationControllerすると、コードを必要とせずにすべてがセットアップされます。

于 2012-01-04T17:51:47.007 に答える
2

生成されたMainWindow-iPad.xibから、Interface Builderで、ビューの下にあるオブジェクトだけでなく、IBにビューコントローラーオブジェクトを追加します。オブジェクトの場合は、クラスをAppDelegateに設定し、View Controllerの場合は、クラスをViewController(i Identity Inspector)に設定し、AttributesInspectorでnib名を指定します。変換元のデバイスのMainWindow.nibを見て、違いを確認できます。

編集:私はいくつかの重要なステップに言及するのを忘れました。また、IBでファイルの所有者クラスを「UIApplication」に設定し、AppDelegateとViewControllerの参照アウトレットを適切に設定する必要があります。繰り返しになりますが、IBでは、使用していたMainWindowペン先の接続インスペクターを確認してエミュレートするのが最も簡単です。MainWindow-iPad.nib(つまり、ViewController-iPad.nib)以外のiPadに固有の別のペン先がある場合は、必ずそのファイルの所有者を選択し、ビューをポイントして、クラスも適切に設定してください。

于 2012-09-11T00:14:38.963 に答える
0

私はあなたの提案を試しましたが、どれも私のためにうまくいきませんでした、ごめんなさい。:/インターフェイスビルダーを使用せずにコードで手動でビューを作成することになりました:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    // Setup view for iPad
} else
    // Setup view for iPhone and iPod Touch
}

実際よりもずっと難しいと思いました。

このメソッドを使用する場合でも、iPhoneとiPadの両方で同じオブジェクトを使用する場合は、Interface Builderですべてを接続し、これらのブロックのオブジェクトのフレームを変更するだけでよいことに注意してください。

于 2012-04-06T05:07:19.613 に答える