2011-12-21 8 views
10

ShareKitでは、コードはrootViewControllerがどこにあるかを判断してモーダルビューを表示する必要があります。何らかの理由で、コードがiOS 5で失敗しています:iOSでのrootViewControllerの検索

// Try to find the root view controller programmically 

    // Find the top window (that is not an alert view or other window) 
    UIWindow *topWindow = [[UIApplication sharedApplication] keyWindow]; 
    if (topWindow.windowLevel != UIWindowLevelNormal) 
    { 
     NSArray *windows = [[UIApplication sharedApplication] windows]; 
     for(topWindow in windows) 
     { 
      if (topWindow.windowLevel == UIWindowLevelNormal) 
       break; 
     } 
    } 

    UIView *rootView = [[topWindow subviews] objectAtIndex:0]; 
    id nextResponder = [rootView nextResponder]; 

    if ([nextResponder isKindOfClass:[UIViewController class]]) 
     self.rootViewController = nextResponder; 

    else 
     NSAssert(NO, @"ShareKit: Could not find a root view controller. You can assign one manually by calling [[SHK currentHelper] setRootViewController:YOURROOTVIEWCONTROLLER]."); 

これはアサルトに当たっています。

代わりに次のコードを使用するだけで何が問題になりますか?

rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 

これは正常に動作しているようです。それはいくつかの条件の下で失敗するでしょうか?

答えて

27

window.rootViewController b/cに頼ることができるかどうかはわかりませんが、設定する必要はありません。ウィンドウにサブビューを追加するだけです。

id rootVC = [[[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0] nextResponder]; 
+0

/// EZSwiftExtensions - Gives you the VC on top so you can easily push your popups public var topMostVC: UIViewController? { var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController while let pVC = presentedVC?.presentedViewController { presentedVC = pVC } if presentedVC == nil { print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.") } return presentedVC } 

そのがで標準機能として組み込ま以下が正常に動作するように見えましたありがとう。この場合、rootViewControllerが設定されます。自動的に設定するだけで、このShareKitコードの目的でrootViewControllerになることは明らかではありません。これは普遍的なアプリであり、iPhoneコードでは、rootViewControllerはサブクラス化されたUITabBarControllerです。私はまた、UIAlertViewとUIViewをサブビューとしてアプリケーションウィンドウに追加したことを追加する必要があります。 (私は、tabbarcontrollerからどのビューが表示されているかに関係なく、どちらか一方または両方を表示できます)。あなたのコードはUIAlertViewをobjectAtIndex:0として返します。私はちょうど残りの部分を繰り返すことができたと思います。 – Jim

+1

あなたのアプリでそれを設定しているなら、それは間違いなく機能します。 'window.rootViewController'が設定されているところに依存できない他の人のためにライブラリを作成していたかどうかはわかりませんでした。 – XJones

+0

@XJones、window.rootViewControllerが設定されていない場合はどうなりますか?現在のView Controllerを確実に取得するための他の方法はありますか? – Zennichimaro

関連する問題