2017-08-31 2 views
1

アラートコントローラを表示するためのカスタムクラスを作成し、クリック時に実行する必要がある定義済みアクションを作成しました。私が他のクラスからその関数を呼び出すと、警告が表示されますが、[OK]ボタンをクリックすると、実行セレクタは呼び出されません。以下は両方の機能です。セレクタを実行してSwiftを呼び出さない

VFSCCocoaUtils.sharedInstance.createCommonAlert(mainTitle: kNoSimCardTitle, mainMessage: kNoSimCardMessage, subTitle: kOkButtonTitle, callBackName: #selector(self.getName), completionHandler: {(alertView) in 
    self.present(alertView, animated: true, completion: nil) 
}) 


func createCommonAlert(mainTitle : String , mainMessage : String , subTitle : String, callBackName : Selector , completionHandler: @escaping (UIAlertController) ->()) { 

    let selector: Selector = callBackName 
    let alertView = UIAlertController(title:mainTitle, message:mainMessage, preferredStyle: .alert) 
    alertView.addAction(UIAlertAction.init(title: subTitle, style: .default, handler: { (alertView) in 
     DispatchQueue.main.async { 
      self.perform(selector) 
     } 
    })) 
    DispatchQueue.main.async { 
     completionHandler(alertView) 
    } 
} 
+1

は#selector(ClassName.getName)と#selector(self.getName)を交換してください。セレクタを作成するときには、selfの代わりにクラスの名前を記述する必要があります。 – ZeMoon

+0

私は#selector(VFSCSettingsViewController.getName)に言及しましたが、動作しませんでした。 – Kashif

+0

クロージャを渡す代わりにセレクタアプローチを使用したのはなぜですか? – ZeMoon

答えて

1

セレクタは、他のクラスではなく、そのクラスのインスタンスに対して実行されるはずです。

func createCommonAlert(mainTitle : String , mainMessage : String , subTitle : String, callBackName : Selector, instance: NSObject , completionHandler: @escaping (UIAlertController) ->()) { 

    let selector: Selector = callBackName 
    let alertView = UIAlertController(title:mainTitle, message:mainMessage, preferredStyle: .alert) 
    alertView.addAction(UIAlertAction.init(title: subTitle, style: .default, handler: { [weak instance](alertView) in 
     DispatchQueue.main.async { 
      instance?.perform(selector) 
     } 
    })) 
    DispatchQueue.main.async { 
     completionHandler(alertView) 
    } 
} 

そして、次のようにこれを呼び出す:あなたは次のように警告の作成を変更する必要があります

VFSCCocoaUtils.sharedInstance.createCommonAlert(mainTitle: kNoSimCardTitle, mainMessage: kNoSimCardMessage, subTitle: kOkButtonTitle, callBackName: #selector(VFSCSettingsViewController.getName), instance: self, completionHandler: {(alertView) in 
    self.present(alertView, animated: true, completion: nil) 
}) 
+0

selfをパラメータとして渡すことはお勧めできません。なぜならselfの参照カウントを1にして強く保持することになるからです。弱い自己を使用してNSObjectをオプションにしてください。同じことをするべきですが少し注意してください。 –

+1

@SandeepBhandariそうです!私は同じ答えを反映するために答えを修正しています。 – ZeMoon

+0

最後に、VCのインスタンスをparamとして渡しているため、VFSCSettingsViewController.getNameを渡したインスタンスでperformセレクタをコールすると、単にgetName :)と言うことができます。 –

関連する問題