web-dev-qa-db-ja.com

Swift-viewControllerからAppDelegateウィンドウにアクセスする

アプリでウォークスルー(オンボーディングフロー)を作成し、スキップボタンが必要です。ボタンはviewControllerにあるため、別のviewControllerに移動する最良の方法は、アプリのデリゲートウィンドウにアクセスすることであることがわかりました。

ただし、AppDelegate.Typeには「window」というメンバーがないというエラーが表示され続けます。

@IBAction func skipWalkthrough(sender: AnyObject) {
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    AppDelegate.window!.rootViewController = RootViewController   
}

そのようなアプローチには何か問題がありますか?

前もって感謝します!

22
DCDC

appDelegateではなくAppDelegateであるはずのタイプミスがあります。このように:

@IBAction func skipWalkthrough(sender: AnyObject) {
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    appDelegate.window!.rootViewController = RootViewController   
}

Swift 3.2

@IBAction func skipWalkthrough(_ sender: AnyObject) {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.window!.rootViewController = controller
    }
49
Stefan Salatic

これは、ストーリーボードの有無に関係なく、Swift 3 +で機能します

let appDelegate = UIApplication.shared.delegate as? AppDelegate
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let homeController = mainStoryboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
appDelegate?.window?.rootViewController = homeController
18
Dasoga

スイフト3

これはより良い方法です:

    if let window = NSApplication.shared().windows.first {
        window.acceptsMouseMovedEvents = true;
    }
9
Ted Lowery

インスタンスの代わりにプロトコル名(つまり、AppDelegate)を使用しています:

する必要があります:

appDelegate.window!.rootViewController = RootViewController   
2
giorashc

条件付きバインディングを使用して、windowに到達することもできます。

if let window = UIApplication.shared.windows.first {
    // use window here.
}
1

アプリからどこからでもタブバーにアクセスできます。以下を使用:

let appDelegate = UIApplication.shared.delegate as! AppDelegate

if let tabBarController = appDelegate.window!.rootViewController as? UITabBarController {
    if let tabItems = tabBarController.tabBar.items {
       let tabItem = tabItems[2]
       tabItem.badgeValue = "5" //enter any value
    }
}
1
Umitk

このソリューションは以下のために機能します:ログイン/登録後、プログラムでUITabbarControllerを追加します

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    appDelegate.window!.rootViewController = tabs //()
    appDelegate.window!.makeKeyAndVisible()
0
Humza Shahid