2017-11-22 11 views
0

UIAlertControllerに追加されたアイテムのハンドラとしてクロージャがあります。私は期待どおりに閉鎖内のid値を受け取ります。 (私はスニペットでそれを使用しません)。クロージャからビューコントローラを表示する

しかし、問題は私が別のビューコントローラに切り替えることです。しかし、私は閉鎖の中でこの呼び出しを行います。

私は次のエラーを取得する: Value of type '(ChooseProfile) ->() -> (ChooseProfile)' has no member 'present

は、どのように私は私のクロージャ内から別のビューコントローラに切り替えることができますか?

class ChooseProfile: UIViewController { 
    let closure = { (id: String) in { (action: UIAlertAction!) -> Void in   
     let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
     let nextViewController = storyBoard.instantiateViewController(withIdentifier: "test") as! UIViewController 
     self.present(nextViewController, animated:true, completion:nil) 
    }} 
} 

私はこのために、このクロージャを使用します。

override func viewDidAppear(_ animated: Bool) { 

     let alert = UIAlertController(title: "Choose a Device", message: "Which device would you like to use in this app?", preferredStyle: UIAlertControllerStyle.alert) 

     for dev in (DataSingleton.instance.getDevices())! { 
      alert.addAction(UIAlertAction(title: dev.getName(), style: UIAlertActionStyle.default, handler: closure(dev.getId()))) 
     } 

     alert.addAction(UIAlertAction(title: "Add a new Profile", style: UIAlertActionStyle.destructive, handler: nil)) 


     // show the alert 
     self.present(alert, animated: true, completion: nil) 
    } 

私は、デバイスのリストに基づいてアラートアクションを追加します。そして、私はデバイスをクリックするとidを取得したい。

+0

あなたはこの閉鎖をどこで宣言していますか? – vacawama

+0

@vacawama私の質問を編集しました – da1lbi3

+0

VCのプロパティはクロージャですか? – vacawama

答えて

1

問題は、クローズで自己を使用していますが、自己がまだ完全には作成されていないため、VCのインスタンスを参照していないことです。代わりに、あなたはそれを呼び出すときにクロージャにviewControllerを渡すのはなぜですか?

class ChooseProfile: UIViewController { 
    let closure = { (id: String, vc: UIViewController) in { [weak vc] (action: UIAlertAction!) -> Void in   
     let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
     let nextViewController = storyBoard.instantiateViewController(withIdentifier: "test") 
     vc?.present(nextViewController, animated:true, completion:nil) 
    }} 
} 

override func viewDidAppear(_ animated: Bool) { 

    let alert = UIAlertController(title: "Choose a Device", message: "Which device would you like to use in this app?", preferredStyle: UIAlertControllerStyle.alert) 

    for dev in (DataSingleton.instance.getDevices())! { 
     alert.addAction(UIAlertAction(title: dev.getName(), style: UIAlertActionStyle.default, handler: closure(dev.getId(), self))) 
    } 

    alert.addAction(UIAlertAction(title: "Add a new Profile", style: UIAlertActionStyle.destructive, handler: nil)) 


    // show the alert 
    self.present(alert, animated: true, completion: nil) 
} 
関連する問題