2013-02-03 33 views
11

Tôi có ứng dụng toàn cầu trong đó tôi đang tải bảng phân cảnh chính theo cách thủ công trong application:didFinishLaunchingWithOptions.Chọn các bảng phân cảnh khác nhau dựa trên loại thiết bị

Tôi có 2 bảng phân cảnh dành cho iPhone và iPad có các hậu tố ~iPhone~iPad. Tôi đang tải bảng phân cảnh của mình bằng cách sử dụng:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
self.initialViewController = [storyboard instantiateInitialViewController]; 

Điều này in Unknown class ViewController in Interface Builder file. vào bảng điều khiển, vì vậy dường như nó không tải bảng phân cảnh chính xác. Tuy nhiên, khi tôi sử dụng [UIStoryboard storyboardWithName:@"MainStoryboard~iPhone" bundle:nil]; nó hoạt động tốt, nhưng tất nhiên sẽ chỉ hoạt động cho iPhone.

Tôi đang thiếu gì? Làm cách nào để sử dụng hậu tố tên để tự động chọn bảng phân cảnh chính xác?

+0

tại sao bạn không đi đến cài đặt dự án và đặt bảng phân cảnh của iphone trong thông tin triển khai iphone và bảng phân cảnh của iPad trong thông tin triển khai iPad. bạn có sử dụng nhiều bảng phân cảnh cho mỗi thiết bị không? tôi có nghĩa là mục đích của bạn là gì trong việc tải các bảng phân cảnh theo cách thủ công? – guenis

+0

Điều tôi đang cố gắng làm là đặt IIViewDeckController làm bộ điều khiển chế độ xem gốc, vì vậy việc tải bảng phân cảnh tự động không giúp ích gì. –

+0

Điều này dường như là một lỗi trong một số phiên bản (nó bị hỏng trong iOS 6.1.2 cho tôi, nhưng nó đã được làm việc trước đó trên cùng một dự án). Theo tài liệu của Apple, hậu tố ~ iphone là phổ quát, nên ảnh hưởng đến tất cả tải tài nguyên của họ (hình ảnh, tệp NIB - trong kinh nghiệm trước đây của tôi, mọi thứ). Có vẻ như Bảng phân cảnh bị hỏng và bằng cách nào đó bỏ qua bộ chọn. – Adam

Trả lời

12

Tôi không biết bất kỳ lựa chọn bảng phân cảnh tự động nào dựa trên hậu tố tên tệp của chúng. Bạn có thể sử dụng userInterfaceIdiom để chọn cho iPad vs iPhone:

if ([[UIDevice currentDevice] userInterfaceIdiom] ==UIUserInterfaceIdiomPad) { 
    UIStoryboard *storyboard = 
    [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil]; 
} else { 
    [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 
} 

Nhưng nếu bạn đang làm điều này để bắt đầu với một bộ điều khiển xem specifc, tất cả các bạn cần làm là kéo 'start' mũi tên để điều khiển xem ưa thích của bạn trong storyboard

Hoặc - chọn bộ điều khiển xem trong kịch bản, đi đến các thuộc tính instpector và đánh dấu isInitialViewController

+1

Tôi nghĩ rằng các bảng phân cảnh sẽ tự động được chọn theo các hậu tố tên tệp như các tệp XIB và hình ảnh. Cảm ơn! –

+0

Bạn có thể thêm danh mục vào UIStoryboard, chẳng hạn như deviceStoryboardWithName: bundle :, sẽ đóng gói mã này thêm hậu tố thích hợp và sau đó gọi bảng phân cảnhWithName: bundle :. Nó sẽ làm cho mã dễ đọc và dễ theo dõi hơn. – GilroyKilroy

+1

Bạn có thể đặt các bảng phân cảnh riêng cho iPhone và iPad trong info.plist của mình. Đây là kết quả thô từ mỏ: UIMainStoryboardFile chính UIMainStoryboardFile ~ ipad iPad Vì vậy, có một chìa khóa riêng biệt cho thiết lập các kịch bản iPad. Và tên tập tin tương ứng trong cấu hình của tôi là Main.storyboard và iPad.storyboard. –

0

// trong appdelegate lớp, trong khi khởi chạy ứng dụng chọn định bảng câu chuyện.

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

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
    { 
     storyboard1 = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:[NSBundle mainBundle]]; 
    } 
    else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     storyboard1 = [UIStoryboard storyboardWithName:@"Main_iPad" bundle:[NSBundle mainBundle]]; 
    } 
    UIViewController *vc = [storyboard instantiateInitialViewController]; 

    // Set root view controller and make windows visible 
    self.window.rootViewController = vc; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 
0

Bạn có thể đặt tên cho kịch bản của bạn như thế này

  • Main.storyboard (dành cho iPhone)
  • Main_iPad.storyboard (cho iPad)

và chọn chúng như

này
- (UIStoryboard *)deviceStoryboardWithName:(NSString *)name bundle:(NSBundle *)bundle { 
    if (IS_IPAD) { 
     NSString *storyboardIpadName = [NSString stringWithFormat:@"%@_iPad", name]; 
     NSString *path = [[NSBundle mainBundle] pathForResource:storyboardIpadName ofType:@"storyboardc"]; 

     if (path.length > 0) { 
      return [UIStoryboard storyboardWithName:storyboardIpadName bundle:bundle]; 
     } 
    } 


    return [UIStoryboard storyboardWithName:name bundle:bundle]; 
} 
0

Đây là anoth điều bạn có thể đặt trực tiếp trong tệp info.plist của mình. Không cần bất kỳ nỗ lực lập trình nào. Tìm kiếm thuộc tính có tên là 'Tên cơ sở tệp bảng phân cảnh chính' sẽ có mặc định là 'Chính'.

Bạn có thể thêm một thuộc tính khác có tên 'Tên cơ sở tệp bảng phân cảnh chính (iPad)' sau đó sẽ được sử dụng cho iPad.

Đây là những gì đầu ra thô trong plist trông giống như:

<key>UIMainStoryboardFile</key> 
<string>Main</string> 
<key>UIMainStoryboardFile~ipad</key> 
<string>iPad</string> 

Afaik nó cũng có thể chỉ cần thêm một kịch bản thứ hai có tên là Main ~ iPad.storyboard (nếu phím UIMainStoryboardFile được thiết lập như chính) . Và điều đó sẽ được chọn cho iPad. Đã không thử nghiệm này trong một thời gian mặc dù.

Các vấn đề liên quan