2010-10-21 87 views
2

我有一個選項卡欄應用程序,並且我想在didFinishLaunchingWithOptions方法加載標籤欄控制器後簡單地顯示一個視圖(啓動畫面)。爲什麼這麼難?請告訴我,我怎麼會加載和顯示名爲SplashView.xib低於XIB文件並顯示:在didFinishLaunchingWithOptions中顯示一個視圖作爲啓動畫面

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

    // Override point for customization after application launch. 

    // Add the tab bar controller's view to the window and display. 
    [window addSubview:tabBarController.view]; 
    [window makeKeyAndVisible]; 

    // Load up and show splash screen Xib here 

    return YES; 
} 

回答

4

我要提到的第一件事情是在HIG中啓動畫面特別令人不滿。特別是那些只會讓用戶等待&盯着他們不關心的標誌。

現在這種咆哮已經消失了,我假設你可能有一些負載在你想要在顯示標籤之前發生。

在這種情況下,我不加載MainWindow.xib中的標籤欄。相反,我啓動我的單一視圖(使用XIB)來完成加載。原因是這樣的:你甚至可以在看到你的啓動畫面之前支付所有這些視圖的加載費用。

在加載數據的情況下,有時這些選項卡依賴於正在加載的數據,所以更加有意義的是等待加載選項卡欄控制器。

應用程序的委託最終看起來像這樣:

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    [window makeKeyAndVisible]; 
    [window addSubview:splashController.view]; //this assumes MainWindow.xib defines your splash screen, otherwise.... 

    UIViewController *splashController = [[SplashController alloc] initWithNibName:@"SplashController" bundle:nil]; 
    splashController.delegate = self; 
    [window addSubview:splashController.view]; 

    //hang on to it in an ivar, remember to release in the dealloc 
} 

然後在閃屏控制器,當我完成加載,我這樣做:

-(void)doneLoading { 
    [self.delegate performSelector:@selector(splashScreenDidFinishLoading)]; 
} 

當然self.delegate沒有按」牛逼存在,它可以被添加簡單的是這樣的:

//header 
@property (nonatomic, assign) id delegate; 

//implementation 
@synthesize delegate; 

然後,只需確保和落實該應用程序代理的方法:

-(void)splashScreenDidFinishLoading { 
    //load up tab bar from nib & display on window 
    //dispose of splash screen controller 
} 

我在少數應用程序中使用了這種模式,很簡單,效果很好。你也可以選擇在上面的方法中做一個漂亮的過渡動畫。

希望這會有所幫助。

+0

我覺得這種方法非常有趣,但是我必須做一些可怕的事情,因爲我使用這段代碼的結果是兩條編譯器消息:1.錯誤:請求成員的「委託」,而不是結構或聯合2.警告:'' UIWindow'可能不會響應'-addSubView:' – 2010-10-21 04:53:35

+0

我輸入這個沒有編譯:)它是addSubview(小寫'v')。 – 2010-10-21 17:15:03

+1

此外,代表是您將自己實現爲splash視圖控制器上的一個屬性的東西。 @屬性(非原子,分配)ID委託;我已更新問題以顯示此... – 2010-10-21 17:15:46

1

我會做這樣的事情:

UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Splash.png"]]; 
    [imageView setCenter:CGPointMake(240, 160)]; 

    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; 
    [self.view addSubview:imageView]; 

    [imageView retain]; 

    [NSTimer scheduledTimerWithTimeInterval:3.0 target:self //display for 3 secs 
    selector:@selector(continueLoadingWhatever:) 
    userInfo:nil 
    repeats:NO]; 

然後...

- (void)continueLoadingWhatever:(id)sender { 
    //do whatever comes after here 
} 

我可能不會在應用程序委託中這樣做,而是在根視圖控制器中。你不應該直接向窗口添加不必要的東西,特別是如果它包含交互(我知道這不)。

+0

我實際上有一些代碼在我的SplashViewController中進行連通性測試,所以我不能只使用一個圖像。儘管如此,但這是很好的代碼。 – 2010-10-21 05:05:25

1

在應用程序委託的頭文件:

@interface AppDelegate { 
    ... 
    IBOutlet UIView *splash; // add this line 
} 

在IB開SplashView.xib,文件所有者的類設置爲類應用程序委託的,連接防濺插座。加入此來顯示閃現觀點:

[[NSBundle mainBundle] loadNibNamed: @"SplashView" owner: self options: nil]; 
[window addSubview: splash]; 

你可能會想隱藏飛濺觀點太:

[splash removeFromSuperview]; 
[splash release]; 
splash = nil; 

你可以使用的UIView動畫塊淡出飛濺視圖要格外爽。也就是說,閃屏是邪惡

我認爲應用程序代表的確是這類東西的一個更好的地方。

+0

爲什麼你覺得應用程序代表是一個更好的地方呢?只是好奇,也許我錯過了一些重要的東西。 – diatrevolo 2010-10-21 20:16:40

+0

由於啓動畫面是一次性UI元素,所以在顯示大部分代碼時甚至未初始化。基本上,只有主要的筆尖被加載,並且至少在你的代碼中唯一的對象是保證被完全注入的應用程序委託。出於完全相同的原因,爲什麼它會收到applicationDidLaunch類型的通知,恕我直言,它是管理啓動屏幕的理想人選。也就是說,將功能封裝在一個特殊的類中並不是一件壞事,如果你覺得它更舒適,但遠非必要。 – Costique 2010-10-21 20:32:36

+0

是的,我可以看到你的意思。非常特殊的情況。 – diatrevolo 2010-10-21 20:49:29