2014-11-06 33 views
6

Tôi đang cố gắng phát triển ứng dụng iOS chi tiết chính (chỉ dành cho iPad) từ mẫu xCode 6. Nó chạy tốt với iOS 8 nhưng chạy nó trên iOS 7.0 hoặc 7.1 tạo ra một vụ tai nạn lúc chạy-thời gian mà tôi đã nhận xét:Mẫu ứng dụng Master-Detail iOS từ xCode 6 không chạy trên iOS 7

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 
    UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 

    // this line throws a "[MasterViewController topViewController]: unrecognized selector sent to instance 0x796dde90" 
    navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem; 
    splitViewController.delegate = self; 
    return YES; 
} 

Để tái tạo các lỗi:

  • Mở Xcode 6
  • file> New> Project
  • Chọn "Master-Chi tiết ứng dụng" bên dưới "ứng dụng iOS"
  • Thay đổi mục tiêu của dự án để 7.0
  • Run trên giả lập hoặc thiết bị

tôi điều tra và có vẻ như rằng các loại đối tượng khác trên iOS 7 và iOS 8:

  • On iOS8, self.window.rootViewController là một UISplitViewController
  • On iOS7, tự .window.rootViewController là UINavigationController đầu tiên (bên trái)

Tại sao lại có hành vi này?

+0

Bạn có đang thử nghiệm trên iPhone hoặc iPad không? –

Trả lời

3

thử thay thế này:

if ([splitViewController respondsToSelector:@selector(displayModeButtonItem)]){ 
    navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem; 
} 
+1

Nó hoạt động nhưng bây giờ tôi chỉ có chế độ xem "chính". Không có thêm chi tiết "xem". –

+0

ah ok, vì vậy chúng tôi cần một {} khác sau đó để xử lý trước iOs8. Tôi không có dự án xem chia nhỏ, xin lỗi. Id cần phải xem xét một mẫu splitView từ xCode5 – Jef

+0

Tôi hiện đang tải xuống xCode 5 để kiểm tra nó. –

3

Đặt điều này dưới prepareForSegue: để đảm bảo khả năng tương thích ngược.

DetailViewController *controller; 
    if ([[segue destinationViewController] isKindOfClass:[UINavigationController class]]) { 
     controller = (DetailViewController *)[[segue destinationViewController] topViewController]; 
    } 
    else { 
     controller = (DetailViewController *)[segue destinationViewController]; 
    } 
[controller setDetailItem:object]; 
1

displayModeButtonItem chỉ hoạt động trên iOS 8 trở lên.

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