2012-01-03 14 views
19

Tôi đang cố chuyển đổi ứng dụng duy nhất của iPhone thành ứng dụng Universal. Tôi chuyển các thiết bị sang Universal và để Xcode làm điều đó tạo ra một MainWindow-iPad.xib cho tôi, và bây giờ khi tôi chạy ứng dụng trong trình mô phỏng iPhone nó hoạt động tốt, nhưng khi tôi chạy nó trong bộ giả lập iPad, tôi nhận được một màu trắng màn hình và lỗi Application windows are expected to have a root view controller at the end of application launch. Tôi đã đọc một số bài viết khác về vấn đề tương tự nhưng không ai trong số họ chỉ giới hạn trong một thiết bị."Cửa sổ ứng dụng dự kiến ​​sẽ có bộ điều khiển chế độ xem gốc khi kết thúc khởi chạy ứng dụng" chỉ trên iPad

Đây là phương pháp application:didFinishLaunchWithOptions: tôi:

- (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; 
} 

EDIT: Tôi chỉ có cái nhìn khiển một gốc mà có kích thước dành cho iPhone gọi RootViewController. Nhưng nó vẫn nên tải trong phải không? Hoặc nếu nó không nên làm thế nào để tôi tạo một cho iPad?

+2

Dãy: http://stackoverflow.com/q/7520971/9530 http://stackoverflow.com/q/7890511/9530 http://stackoverflow.com/q/8190567/9530 http: // stackoverflow. com/q/11515818/9530 http://stackoverflow.com/q/9844626/9530 và có thể thêm –

Trả lời

52

Thay đổi dòng sau:

[_window addSubview:[_navigationController view]]; 

tới:

_window.rootViewController = _navigationController; 

hoặc, nếu bạn cần iOS 3 khả năng tương thích:

if ([_window respondsToSelector:@selector(setRootViewController:)]) { 
    _window.rootViewController = _navigationController; 
} else { 
    [_window addSubview:_navigationController.view]; 
} 
+1

cảm ơn, nhưng điều đó không thay đổi bất cứ điều gì. bất cứ một đề nghị nào khác? –

+1

đã làm việc cho tôi, cảm ơn – davis

+1

Tuyệt vời. Làm việc cho tôi là tốt. Cảm ơn bạn. –

2

Bạn cần phải tạo một RootViewController với xib tập tin cho iPad, nếu không bạn sẽ nhận được lỗi này. Dưới đây là mã mẫu được cung cấp bởi Xcode cho ứng dụng toàn cầu. Nếu bạn gỡ lỗi ứng dụng trong trình mô phỏng iPad và trỏ trình gỡ rối để chạy tạo bộ điều khiển chế độ xem với tệp xib trên iPhone, bạn sẽ thấy lỗi chính xác.

- (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; 
} 
2

Trong iOS 4 trở lên, UIWindow có thuộc tính settable rootViewController. Đây là số UINavigationController đẩy số UIViewController được hiển thị khi khởi chạy ứng dụng. Trong Xcode IB, chọn Cảnh ban đầu: Bộ điều khiển chế độ xem ban đầu cho số UINavigationController đặt mọi thứ không cần mã.

0

Tôi đã thử đề xuất của bạn nhưng không ai trong số họ làm việc cho tôi, xin lỗi. :/Tôi đã chỉ tạo chế độ xem theo cách thủ công trong mã mà không có trình tạo giao diện:

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

mà tôi nghĩ sẽ khó hơn rất nhiều so với thực tế. Lưu ý rằng nếu bạn sử dụng phương pháp này bạn vẫn có thể kết nối mọi thứ trong trình tạo giao diện và chỉ cần thay đổi khung của các đối tượng trong các khối này nếu bạn sẽ có cùng các đối tượng trên cả iPhone và iPad.

2

Từ MainWindow-iPad.xib được tạo ra, trong bộ dựng giao diện, thêm đối tượng View Controller trong IB, cũng như đối tượng bên dưới khung nhìn. Đối với đối tượng, đặt class là AppDelegate, cho View Controller, thiết lập lớp thành ViewController (i the Identity Inspector) và chỉ định tên nib trong Attributes Inspector. Bạn có thể xem MainWindow.nib cho thiết bị mà bạn đã chuyển đổi để xem sự khác biệt.

Chỉnh sửa: Tôi quên đề cập đến một số bước quan trọng. Bạn cũng sẽ cần đặt lớp Chủ sở hữu của tệp thành "UIApplication" trong IB và đặt các cửa hàng tham chiếu một cách thích hợp cho App Delegate và View Controller. Một lần nữa, trong IB, nó dễ dàng nhất để nhìn vào Thanh tra kết nối cho các nib MainWindow bạn đã có và thi đua nó. Nếu bạn có một nib cụ thể cho iPad, ngoài MainWindow-iPad.nib (tức là ViewController-iPad.nib), hãy chắc chắn chọn nó là chủ sở hữu của tập tin và điểm nó vào xem và đặt nó là lớp học một cách thích hợp quá.