2010-08-08 56 views
6

的iOS4之前,我的應用程序的初始視圖控制器將檢查在viewWillAppear中,如果設置變量/關設定密碼,呈現模式密碼屏幕將呆在那裏,直到輸入正確的密碼或主頁按鈕被按下。使用applicationwillenterforeground的密碼屏幕

隨着iOS4的,如果我的應用程序一直在後臺,我想包含在數據中的應用是不容易接觸,如果他們要交出自己的手機給別人使用的用戶感到舒適。由於應用程序可以返回到任何屏幕(該應用程序最後一個屏幕),我想我會在本地選擇器(重複的enterPasscode方法)遍佈整個地方使用UIApplicationWillEnterForegroundNotification,每個屏幕都有正確的視圖控制器基於本地屏幕推送,但必須有更好的方法。

我在這裏可以具有輕微的概念誤解。有人可以提出另一種方法,或者推動我繼續下一步。我可以把它作爲一個共享方法,但仍然知道正確的本地視圖控制器推送?

感謝

編輯/ UPDATE:

短版:它的工作原理,但可能仍有可能是一個更好的方法(能夠理解的任何幫助)...

我創建了一個標準單用一個視圖控制器。

PasscodeView.h包含:含

UIViewController *viewController; 
@property (nonatomic, retain) UIViewController *viewController; 

PasscodeView.m:

@synthesize viewController; 

我把這個在AppDelegate中:

-(void)applicationWillEnterForeground:(UIApplication*)application { 

    PasscodeView *passcodeView = [PasscodeView sharedDataManager]; 
    UIViewController *currentController = [passcodeView viewController]; 
    NSLog(@"%@", currentController); //testing 
    EnterPasscode *passcodeInput = [[EnterPasscode alloc] initWithNibName:@"Passcode" bundle:nil]; 
    [currentController presentModalViewController:passcodeInput animated:NO]; 
    [passcodeInput release]; 
} 

,在我所有的viewDidLoad以下,當我進入每個屏幕時更新當前視圖控制器(只有2行,但似乎仍然存在)一個更好的方法):

PasscodeView *passcodeView = [PasscodeView sharedSingleton]; 
passcodeView.viewController = [[self navigationController] visibleViewController]; 

我希望有已經得到來自applicationWillEnterForeground當前視圖控制器的方式,但我無法找到它 - 在這裏任何幫助,還讚賞。

爲了保持一致性,我換了一個線,並增加了專線,以獲得導航欄,以匹配應用程序的其餘部分,包括標題。

UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeInput]; 
[currentController presentModalViewController: passcodeNavigationController animated:NO]; 

回答

3

您可以通過實現

-(void)applicationWillEnterForeground:(UIApplication*)application; 

你可能實現存儲當前適當的模式視圖控制器單身,在每個視圖控制器的viewWillAppear中更新它集中在你的應用程序委託此行爲。

編輯:我假設你已經有一系列你想展示的視圖控制器。我懷疑你真的需要它。如果你有一個叫,說PasscodeInputController,那麼你的applicationWillEnterForeground看起來是這樣的:

-(void)applicationWillEnterForeground:(UIApplication*)application { 
    UIViewController *currentController = [window rootViewController]; 
    PasscodeInputController *passcodeInput = [[PasscodeInputController alloc] init]; 

    [currentController presentModalViewController:passcodeInput animated:NO]; 
    [passcodeInput release]; 
} 

我希望地址你的問題更直接。

+0

這是我開始的地方,但不知道要爲視圖控制器放置什麼 - 我會給這個想法然後試一試。 – 2010-08-08 18:02:39

+0

請參閱上面的編輯。 – 2010-08-08 18:23:09

+0

我從概念上理解你正在嘗試的 - 在這裏提供一個密碼屏幕而不是在每個視圖控制器 - 看起來它應該工作,但事實並非如此。完全按照原樣複製代碼(將PasscodeInputController更改爲EnterPasscode),生成良好,沒有錯誤,沒有警告,但沒有出現。我最初並不熟悉UIWindow的rootViewController屬性,但在讀完它之後,它看起來應該可以工作 - 儘管找不到任何其他示例。我試了一些其他的東西 - 嘗試在那裏使用navcontroller,嘗試了子視圖,makeKeyAndVisible但沒有。 – 2010-08-09 03:29:25

1

重新進入前景時,應用程序的行爲應該與第一次啓動時的行爲儘可能相似。考慮到這一點,你可以結合你的applicationDidFinishLaunching:applicationWillEnterForeground:,但考慮到一些視圖可能已經加載。該代碼是這樣的:

id myState = (isReentering) ? [self validateState] : [self loadStateFromSave]; 
NSArray * keyForObjectToLoad = [self objectsToLoadForState:myState]; 
for(NSString * key in keyForObjectToLoad) 
    if(![self objectForKey:key]) [self loadObjectForKey:key]; 

根據您的應用程序的細節可能需要最初的工作,但它有一些好處:

  • 將確保啓動和重新發起類似,因此用戶體驗不是「隨機的」。
  • 您可以在後臺更輕鬆地釋放許多不需要的內存。
  • 從中心位置管理應用程序的狀態會更容易。