2011-10-14 31 views
5

Tôi đã bắt đầu chơi với iOS 5 hôm nay và tôi đã thấy rằng XCode 4.2 chỉ cho phép tôi chọn iOS 5 làm SDK cơ sở chứ không phải iOS 4.Tôi nên làm gì để điều chỉnh ứng dụng của mình sang iOS 5.0 tương thích với iOS 4

Cho đến bây giờ tôi đã ghi đè drawRect: phương thức trong UINavigationBar để tùy chỉnh giao diện của nó nhưng iOS 5 không gọi phương thức đó nữa. Bây giờ tôi đã sử dụng [UINavigationBar xuất hiện] để làm điều đó (mà tôi nghĩ là tốt hơn nhiều). Tuy nhiên, phương thức xuất hiện chỉ có sẵn trong iOS 5 vì vậy nếu tôi sử dụng nó thì ứng dụng của tôi bị treo khi thực hiện trên iOS 4. Tôi nên làm gì? Tôi có phải kiểm tra phiên bản iOS có macro ở mọi nơi tôi sử dụng phương pháp iOS 5 không?

Cảm ơn bạn,

Ariel

Trả lời

16

Câu trả lời cho câu hỏi đầu tiên của bạn là: Bạn phải sử dụng iOS5 (hoặc SDK iOS mới nhất) làm SDK cơ sở của mình, nhưng bạn đặt phiên bản iOS được hỗ trợ tối thiểu trong Mục tiêu triển khai. Ở đó bạn có thể thiết lập iOS4.0 (hoặc bất cứ điều gì bạn muốn).

Cách chính xác để giải quyết câu hỏi thứ hai của bạn là kiểm tra khả năng , không phải phiên bản. Vì vậy, một cái gì đó như thế này sẽ làm việc trong tiếng nói, phương pháp application:didFinishLaunchingWithOptions: của bạn:

// iOS5-only to customize the nav bar appearance 
if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) { 
    UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"]; 
    [[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault]; 
} 

Sau đó bạn sẽ được biên dịch này so với iOS5 SDK, vì vậy việc sử dụng các appearance ở tất cả sẽ ổn thôi. Nhưng khi mã được biên dịch này chạy trên một phiên bản iOS trước 5, nó sẽ ổn.

Như đã nói trước đây, bạn có thể giữ mã drawRect:.

+0

'[[UINavigationBar class] respondsToSelector: @selector (appearance)]' có thể được viết là '[UINavigationBar respondsToSelector: @selector (xuất hiện)]' – user102008

0

Bạn có thể đặt cùng một mảnh mã trong cả drawRect: rằng iOS 4 sử dụng và proxy được trả về bởi [UINavigationBar xuất hiện]. Hai đường dẫn mã khác nhau.

0

Bạn không thể làm điều này với các macro vì cả hai đường dẫn mã phải được đặt đúng chỗ và đường đi chính xác phụ thuộc vào kiểm tra thời gian chạy.

Soooo ... sử dụng một cái gì đó như thế này:

NSString *os_version = [[UIDevice currentDevice] systemVersion]; 

để có được phiên bản iOS mà bạn đang chạy trên và thực hiện [UINavigationBar xuất hiện] dưới 5 & mới hơn, và bạn có thể rơi trở lại drawRect điều trên iOS 4.

+0

Đây là một ý tưởng tồi. Về mặt kỹ thuật sử dụng phiên bản hệ điều hành sẽ làm việc cho hầu hết các trường hợp, nhưng nó không phải là một giải pháp vững chắc. Cho phép nói tintColor được thêm vào UIBarButtonItem trong iOS 5, không được chấp nhận trong iOS 6 và bị xóa trong iOS 7. Các ứng dụng được cài đặt với phiên bản iOS 5 sẽ ngừng hoạt động bình thường trong iOS giả định 7. Chắc chắn, bạn có thể phát hành bản cập nhật theo thời gian bổ sung thêm điều kiện và phức tạp, nhưng tại sao không chỉ sử dụng - [respondsToSelector:] và không lo lắng về quá khứ HOẶC tương lai ?? –

3

Một cách khác để tùy chỉnh tiêu đề của bạn là như thế này.

UIImage *image = [UIImage imageNamed:@"header.png"]; 

if([navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 
    //iOS 5 new UINavigationBar custom background 
    [navigationBar setBackgroundImage:image forBarMetrics: UIBarMetricsDefault]; 
} 
else{ 
    UIImageView *imgView = [[[UIImageView alloc] initWithImage:image] autorelease]; 
    [imgView setUserInteractionEnabled:NO]; 
    [imgView setTag:TOOLBAR_TAG]; 
    [navigationBar insertSubview:imgView atIndex:0]; 
} 

Sử dụng respondsToSelector bạn có thể biết nếu chức năng là ở đây.

0

Cũng tận dụng lợi thế của việc tải xuống 4,3 trình mô phỏng cho iPhone và iPad. Sau đó, bạn có thể gặp sự cố nhanh hơn khi bạn vô tình sử dụng các công cụ iOS 5 trên 4.3 --Tom

+0

Chúng được sử dụng để hỗ trợ có nhiều SDK được cài đặt, nhưng tôi đoán nó đã biến mất rồi. –

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