2014-02-19 22 views
0

好吧我對IOS開發很陌生,但我正在編寫一個應用程序,我正在使用計時器類來超時用戶,如果他們在故事板中的任何特定場景上閒置時間過長,並且會使用戶回到原始場景/視圖。我有一個由多個場景/視圖組成的單個故事板(不知道這裏的正確單詞是什麼),並且每個場景都有它自己的視圖控制器。Xcode IOS - 如何獲得當前在appdelegate中查看的場景/視圖

我通過appdelegate類完成了超時。見下面的代碼。

所以我有代碼工作,它的工作原理很好,但我試圖讓它會忽略計時器,如果我們在主場景。

我已經使用了這個,閱讀了大量的文檔,並嘗試了很多東西,但到目前爲止我還沒有能夠弄清楚如何在applicationDidTimeout方法中獲取當前查看的場景。

如果我能得到當前查看的場景/視圖的名稱,那麼我可以選擇忽略定時器。

有誰知道如何做到這一點?

謝謝你的時間。

#import "StoryboardAppDelegate.h" 

#import "TIMERUIApplication.h" 

@implementation StoryboardAppDelegate 

@synthesize window = _window; 

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

{ 

    // applicaiton has timed out 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidTimeout:) name:kApplicationDidTimeoutNotification object:nil]; 

    return YES; 

} 

-(void)applicationDidTimeout:(NSNotification *) notif 

{ 

    NSLog (@"time exceeded!!"); 



    UIViewController *controller = [[UIStoryboard storyboardWithName:@"Main" bundle:NULL] instantiateViewControllerWithIdentifier:@"StoryboardViewController"]; 



    UINavigationController * navigation = [[UINavigationController alloc]initWithRootViewController:controller]; 



    [self.window setRootViewController:navigation]; 

    navigation.delegate = self; 

    navigation.navigationBarHidden = YES; 

    if (controller) { 

     @try { 

      [navigation pushViewController:controller animated:NO]; 

     } @catch (NSException * ex) { 

      //「Pushing the same view controller instance more than once is not supported」 

      //NSInvalidArgumentException 

      NSLog(@"Exception: [%@]:%@",[ex class], ex); 

      NSLog(@"ex.name:'%@'", ex.name); 

      NSLog(@"ex.reason:'%@'", ex.reason); 

      //Full error includes class pointer address so only care if it starts with this error 

      NSRange range = [ex.reason rangeOfString:@"Pushing the same view controller instance more than once is not supported"]; 



      if ([ex.name isEqualToString:@"NSInvalidArgumentException"] && 

       range.location != NSNotFound) { 

       //view controller already exists in the stack - just pop back to it 

       [navigation popToViewController:controller animated:NO]; 

      } else { 

       NSLog(@"ERROR:UNHANDLED EXCEPTION TYPE:%@", ex); 

      } 

     } @finally { 

      //NSLog(@"finally"); 

     } 

    } else { 

     NSLog(@"ERROR:pushViewController: viewController is nil"); 

    } 

    [(TIMERUIApplication *)[UIApplication sharedApplication] resetIdleTimer]; 

} 

@end 
+0

那麼,我知道獲取「當前查看視圖」的一種方法是獲取頂部窗口。你可以通過說UIViewController * topView = self.window.subViews [0]; – user2277872

+0

好的,我會試試這個謝謝! – ChiquitaLord

+0

好的,當我在調試模式下訪問topView並查看它的屬性時,它並沒有給我任何有用的信息來識別它。例如,它的標題是零。 一旦我有topview我需要做什麼來弄清楚我在哪個場景? 再次感謝您的幫助。 – ChiquitaLord

回答

0

我假設你已經在某處寫了計時器的邏輯。當你彈出回到rootViewController時,你能否使計時器無效?

此外,而不是推的viewController到navigationViewController和處理錯誤,你應該檢查,看看是否你推控制器已經在堆棧像這樣:

if (![navigation.viewControllers containsObject:viewController] { 
    // push onto the stack 
} 

你也可以檢查看看有多少水平的navigationController目前通過檢查viewControllers陣列的像這樣的計數:

if ([navigation.viewControllers count] == 0) { 
    // I know we're on the main screen because no additional viewControllers have been added to the stack. 
} 
+0

是的。該邏輯被寫入一個類文件,並啓動它在main.m中運行。我會嘗試你的想法,並回到你身邊。 #進口 #進口 「StoryboardAppDelegate.h」 #進口 「TIMERUIApplication.h」 INT主(INT的argc,字符* argv的[]) { @autoreleasepool { return UIApplicationMain(argc,argv,NSStringFromClass([TIMERUIApplication class]),NSStringFromClass([StoryboardAppDelegate class])); } } – ChiquitaLord

+0

當我得到viewcontrollers的數量,它總是1它似乎,從來沒有0.我想這可能是因爲我在編程上聲明的導航控制器? 另外我想避免使計時器失效,因爲這是一種棘手的事情來管理,並希望如果可能的話,允許它繼續在應用程序的整個生命週期中滴答滴答。 有沒有其他想法? 謝謝! – ChiquitaLord

+0

您是否每次應用超時都創建一個新的NavigationViewController?那是你要的嗎?也許你需要將navigationViewController作爲一個屬性來存儲,並且不斷從它的堆棧中彈出/彈出。 – jervine10

0

如果你沒有使用模式控制器的任何地方那麼最簡單的解決辦法是

UINavigationController* nav = (UINavigationController*)self.window.rootViewController; // You could just save the nav as part of your app delegate 
if (nav.viewControllers.count > 1){ 
    [nav popToRootViewControllerAnimated:YES]; 
} 

這是不同的,那麼當前的代碼,因爲你的主頁將不會被刪除並重新創建每個定時器熄滅

+0

謝謝,我會給這個鏡頭。 – ChiquitaLord

+0

當我嘗試使用您使用的代碼來獲取計數時,我收到一個異常「發送到實例UIViewController的無法識別的選擇器」。 因此,我修改了你告訴我的內容,並使用我的導航實例調用了count屬性,而且無論我處於什麼場景,代碼中的count總是等於1。 也許我錯誤地構建了我的應用程序;我對此很新。 還有什麼想法? 謝謝你的時間。 – ChiquitaLord

+0

我只是想出了一個簡單的解決方法來解決這個問題。由於我今天剛加入,所以不會讓我在明天之前發佈解決方案。 明天我會發布我的解決方案。 =) 感謝大家的幫助。 從.net編碼到做mac IOS開發工作很有意思。如此不同,但我真的很喜歡它,只需要時間來理解一種新的做事方式。 =) – ChiquitaLord

0

好吧,我想通了,如何做到這一點的時間。我這樣做太複雜了。

爲了解決這個問題,我只是在應用程序委託類中創建了一個屬性和方法,我可以設置場景名稱。

然後在每個視圖控制器頭文件中,我導入應用程序委託類的頭文件並定義對它的引用。然後,在每個視圖的加載事件中,我只需使用這一行代碼在應用程序委託類中設置場景名稱即可。

[myAppDelegate setSceneName:self.title];

很容易!

相關問題