2010-08-08 16 views
6

iOS4'ten önce, uygulamamın ilk görüntüleme denetleyicisi, viewWillAppear'da bir parola açma/kapama ayarları değişkenini kontrol eder ve eğer ayarlanmışsa, doğru parola girilinceye kadar orada kalacak olan kalıcı bir parola ekranı sunun veya Ana ekran düğmesine basıldı.Bir şifre kodu ekranı için applicationwillenterforeground öğesini kullanma

iOS4 ile, uygulamam arka planda olsaydı, kullanıcıların telefonlarını kullanmak üzere birine teslim etmeleri durumunda uygulama içindeki verilerin kolayca erişilemeyeceğini rahat hissetmelerini isterim.

Uygulama, herhangi bir ekrana (uygulamanın sonuncu olduğu ekrana) dönebileceğinden, UIApplicationWillEnterForegroundNotification öğesini her yerde yerel seçicilere (duplicate enterPasscode yöntemleri) kullanacağımı düşündüm. Yerel ekrana göre itin, ancak daha iyi bir yol olmalı.

Burada ufak bir kavramsal yanlış anlama olabilir. Birisi başka bir yaklaşım önerebilir veya bir sonraki adıma geçebilir. Bunu paylaşılan bir yöntem olarak kullanabilir miyim, ancak itmek için doğru yerel görüntü denetleyicisini hala biliyor musunuz?

Teşekkür

DÜZENLEME/GÜNCELLEME:

Kısa versiyon: O inşaat, ama hala standart bir singleton yarattı

daha iyi bir yol (takdir herhangi bir yardım) ... olabilir olabilir bir görünüm denetleyicisi. içeren

PasscodeView.h:

@synthesize viewController; 

Ben AppDelegate bu koymak:

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

PasscodeView.m içeren

-(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]; 
} 

ve tüm viewDidLoad ardından, her ekrana gittiğimde mevcut görüntü denetleyicisini güncellemek (sadece 2 satır var ama yine de öyle görünüyor) s daha iyi bir yolu):

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

Ben applicationWillEnterForeground dan geçerli görünüm denetleyicisi aldık bir yolu olsaydı ama bunu bulamadık - burada herhangi bir yardım hala takdir.

Tutarlılık açısından, bir çizgiyi değiştirdim ve uygulamanın geri kalanıyla eşleşen bir başlık eklemek için bir gezinme çubuğu almak için bir satır ekledim.

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

cevap

3

Sen görünüm denetleyicileri her viewWillAppear bunu güncellenmesi, Şu anda uygun modal görünümü denetleyicisi depolayan a tek uygulamak olabilir

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

uygulayarak uygulama temsilcinize bu davranışı merkezileştirebilirsiniz.

Edit: Göstermek istediğiniz bir dizi görüntü denetleyicinizin olduğunu varsayıyordum. Buna gerçekten ihtiyacın olduğundan şüphe ediyorum.O adresleri soru daha doğrudan umut

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

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

: Eğer denilen birine sahip PasscodeInputController derseniz gibi, sonra applicationWillEnterForeground görünecektir.

+0

Başladığım yer burası ancak bir denetleyici denetleyicisine neyin ekleneceğini bilmiyordum - Bunu biraz düşüneceğim ve sonra bir deneyin. –

+0

yukarıdaki düzenlemeleri görün. –

+0

Kavramsal olarak, neyi denediğinizi anlıyorum - her görüntü denetleyiciden ziyade bir şifre ekranı sunun - işe yarayacak gibi görünüyor ama değil. Kopyalanan kodu olduğu gibi (PasscodeInputController EnterPasscode olarak değiştirildi), iyi, hata, hiçbir uyarı oluşturmaz, ancak hiçbir şey ortaya çıkar. Başlangıçta UIWindow'un rootViewController özelliği ile aşina olmadım ama ne olduğunu okuduktan sonra, işe yarayacak gibi görünüyor - başka örnekler bulamadı. Birkaç başka şey denedim - orada bir navcontroller denedim, subview, makeKeyAndVisible denedim ama hiçbir şey. –

1

Uygulamanızın ön plana yeniden giriş yaparken davranışı, ilk kez kullanıma sunulduğunda olabildiğince benzer olmalıdır. Bunu aklınızda tutarak, applicationDidFinishLaunching:'nuzu applicationWillEnterForeground: ile birleştirebilirsiniz, ancak bazı görünümlerin zaten yüklü olduğunu düşünebilirsiniz. kodu şöyle bir şeydir:

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

başlangıçtaki çalışmaları gerektirebilir uygulamanızın detay bağlı olarak, ancak bazı faydaları vardır:

    Bu benzerdir başlatılması ve yeniden yayına sağlayacak
  • , dolayısıyla kullanıcı deneyimi "rastgele" değildir.
  • Arka planda çok sayıda istenmeyen belleği daha kolay yapabilirsiniz.
  • Uygulamanızın durumunu merkezi bir yerden yönetmek daha kolaydır.
İlgili konular