[ios] 경고 : 뷰가 창 계층 구조에없는 *에 *를 표시하려고합니다.

데이터 모델에 저장된 데이터가 ViewController 있는지 여부 를 제시하려고합니다 . 하지만 다음과 같은 오류가 발생합니다.

경고 : *보기가 창 계층 구조에없는 경우에 *를 표시하려고합니다. ”

관련 코드 :

override func viewDidLoad() {
    super.viewDidLoad()
    loginButton.backgroundColor = UIColor.orangeColor()

    var request = NSFetchRequest(entityName: "UserData")
    request.returnsObjectsAsFaults = false

    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!

    var results:NSArray = context.executeFetchRequest(request, error: nil)!

    if(results.count <= 0){
        print("Inga resultat")
    } else {
        print("SWITCH VIEW PLOX")
        let internVC = self.storyboard?.instantiateViewControllerWithIdentifier("internVC") as internViewController
        self.presentViewController(internVC, animated: true, completion: nil)
    }
}

Google을 사용하여 찾은 다른 솔루션을 성공하지 못했습니다.



답변

코드의이 시점에서 뷰 컨트롤러의 뷰는 생성되었을뿐 뷰 계층에 추가되지 않았습니다. 가능한 한 빨리 해당 뷰 컨트롤러에서 viewDidAppear프레젠테이션하려면 가장 안전 해야합니다 .


답변

객관적인 C에서 : 이것은 mpmovieplayer 위에 viewcontroller를 표시 할 때 내 문제를 해결했습니다.

- (UIViewController*) topMostController
{
    UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;

    while (topController.presentedViewController) {
        topController = topController.presentedViewController;
    }

    return topController;
}


답변

스위프트 3

나는 이것을 초보자로 계속해서 올렸고 현재는 무시할 수있는 모달 뷰를로드하지만 모달을 표시 할 필요가없는 경우 루트 컨트롤러로 전환하는 것이 가장 좋습니다.

나는 이것을 사용하고 있었다

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc  = storyboard?.instantiateViewController(withIdentifier: "MainAppStoryboard") as! TabbarController
present(vc, animated: false, completion: nil)

내 tabController와 함께 대신 이것을 사용하십시오.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let view = storyboard.instantiateViewController(withIdentifier: "MainAppStoryboard") as UIViewController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
//show window
appDelegate.window?.rootViewController = view

여러 스토리 보드 화면간에 전환해야하는 경우보기 컨트롤러로 조정하면됩니다.


답변

스위프트 3.

이 함수를 호출하여 최상위 뷰 컨트롤러를 가져온 다음 해당 뷰 컨트롤러를 제공합니다.

func topMostController() -> UIViewController {
    var topController: UIViewController = UIApplication.shared.keyWindow!.rootViewController!
        while (topController.presentedViewController != nil) {
            topController = topController.presentedViewController!
        }
        return topController
    }

용법:

let topVC = topMostController()
let vcToPresent = self.storyboard!.instantiateViewController(withIdentifier: "YourVCStoryboardID") as! YourViewController
topVC.present(vcToPresent, animated: true, completion: nil)


답변

SWIFT 용

func topMostController() -> UIViewController {
    var topController: UIViewController = UIApplication.sharedApplication().keyWindow!.rootViewController!
    while (topController.presentedViewController != nil) {
        topController = topController.presentedViewController!
    }
    return topController
}


답변

지연 시간이있는 선택기를 수행하면됩니다 (0 초 작동).

override func viewDidLoad() {
    super.viewDidLoad()
    perform(#selector(presentExampleController), with: nil, afterDelay: 0)
}

@objc private func presentExampleController() {
    let exampleStoryboard = UIStoryboard(named: "example", bundle: nil)
    let exampleVC = storyboard.instantiateViewController(withIdentifier: "ExampleVC") as! ExampleVC
    present(exampleVC, animated: true)
}


답변

스위프트 4

func topMostController() -> UIViewController {
    var topController: UIViewController = UIApplication.shared.keyWindow!.rootViewController!
    while (topController.presentedViewController != nil) {
        topController = topController.presentedViewController!
    }
    return topController
}