簡體   English   中英

在視圖控制器中為iPhone / iPad動態加載筆尖

[英]Dynamically load nib for iPhone/iPad within view controller

我已經使用XCode中的向導將iPhone應用程序轉換為通用應用程序。

它建立得很好但顯然在某些方面看起來有點垃圾:)

我需要根據使用的設備加載筆尖。 我不希望使用initWithNib創建我的視圖控制器,因為我已經有代碼用一些數據創建控制器( initWithMyLovelyData ),它與nib加載沒有任何關系。

我知道要找出你使用UI_USER_INTERFACE_IDIOM()的設備,所以我嘗試在實際的視圖控制器本身中覆蓋initWithNibName ,假設它們以某種方式在內部調用。 但它不起作用,因為我猜我不確定語法。

我努力了

if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil];

這不起作用:/

編輯 - 我知道我已經大量編輯了這個,在做了一些更多的研究之后讓我的問題更加具體 - 道歉!

實際上,Apple會自動執行所有操作,只需命名您的NIB文件:

MyViewController~iphone.xib // iPhone
MyViewController~ipad.xib // iPad

並使用最少量的代碼加載視圖控制器:

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything

編輯:@ Adam的答案是正確的答案。

要確定要加載哪個nib,請執行以下操作,並廢棄initWithMyLovelyData方法並使用屬性設置數據。 您應該能夠輕松地將所有初始化代碼移動到屬性setter方法中。

MyViewController *viewController;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    viewController = [[MyViewController alloc] initWithNibName:@"ipadNIB" bundle:nil];
} else {
    viewController = [[MyViewController alloc] initWithNibName:@"iphoneNIB" bundle:nil];
}

viewController.myLovelyData = someData;

我只是將這兩個方法放在一個名為IPadHelper的類中,並使用addIPadSuffixWhenOnIPad方法根據平台有條件地在兩個筆尖之間進行選擇

+ (BOOL)isIPad{
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2){
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){
            return YES;
        }
    }
    return NO;
}

+ (NSString *)addIPadSuffixWhenOnIPad:(NSString *)resourceName{
    if([IPadHelper isIPad]){
        return [resourceName stringByAppendingString:@"-iPad"];
    }
    else {
        return resourceName;
    }   
}

請參閱此處h ttp://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html以獲取有關第一種方法的更多說明...

你可以吃蛋糕,也可以吃。 只需添加一個包裝initWithNibName:bundle的方法:並添加myLovelyData參數:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil  myLovelyData:(id)data
{
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    {
        // Custom initialization using myLovelyData
        //
    }
    return self;
}

我認為創建C文件會更好。
FileHelper.h

#import <Foundation/Foundation.h>
BOOL isIPad();
NSString *addIPadSuffixWhenOnIPad(NSString *resourceName);

FileHelper.m

#import "FileHelper.h"
BOOL isIPad() {
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2) {
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
            return YES;
        }
    }
    return NO;
}

NSString *addIPadSuffixWhenOnIPad(NSString *resourceName) {
    if(isIPad()) {
        return [resourceName stringByAppendingString:@"-iPad"];
    }
    else {
        return resourceName;
    }   
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM