2016-10-30 5 views
1

selectionDidFinish(controller:)というメソッドをデリゲートに配置して、デリゲートが提示したviewControllerを閉じることができます。私のDismissableプロトコルを採用しているコントローラは、selectionDidFinish(controller:)メソッドを呼び出すべきアクションを添付したUIBarButtonItemを持っていますが、「引数は '#selector'が「初期化子またはメソッドを参照していません」というエラーです。'#selector'の引数がイニシャライザまたはメソッドを参照していません

エラーは、この中では、UIViewControllerを提示:

class FormulaInfoViewController: UIViewController, Dismissable { 

    weak var dismissalDelegate: DismissalDelegate? 
    override func viewDidLoad() { 
     super.viewDidLoad() 

    // Xcode doesn't like this selector 
    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(dismissalDelegate?.selectionDidFinish(self))) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

私はそれがdismissalDelegate?.selectionDidFinish(self))を見ることができない理由を私は理解できないdismissalDelegateFormulasTableViewControllerに正しく設定取得していることが確認されました。

私はUIViewControllerを提示する関連するコードは次のとおりです。

class FormulasTableViewController: UITableViewController, DismissalDelegate { 

    let formulas: [CalculationFormula] = [ 
    CalculationFormula.epley, 
    CalculationFormula.baechle, 
    CalculationFormula.brzychi, 
    CalculationFormula.lander, 
    CalculationFormula.lombardi, 
    CalculationFormula.mayhewEtAl, 
    CalculationFormula.oConnerEtAl] 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    let liftInfoImage = UIImage(named: "info_icon") 
    let liftInfoButton = UIBarButtonItem(image: liftInfoImage, style: .Plain, target: self, action: #selector(self.segueToFormulaInfo(_:))) 
    self.navigationItem.rightBarButtonItem = liftInfoButton 
    } 

    func selectionDidFinish(controller: UIViewController) { 
    self.dismissViewControllerAnimated(true, completion: nil) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let nav = segue.destinationViewController as! UINavigationController 
    let vc = nav.topViewController as! Dismissable 
    vc.dismissalDelegate = self 
    } 

    func segueToFormulaInfo(sender: UIButton) { 
     performSegueWithIdentifier("segueToFormulaInfo", sender: self) 
    } 
} 

私は#selectorを使用する方法の研究のすべての種類をやったと私はthis post思ったすべての答えを持っていたが、それはしていません。

私が持つと@objcにさらすことなく、このDismissableプロトコル試してみた:

@objc protocol Dismissable: class { 
    weak var dismissalDelegate: DismissalDelegate? { 
     get set } 
    } 

をそして、私は私のDismissalDelegateプロトコルでそれをも試してみた:

@objc protocol DismissalDelegate : class { 
    func selectionDidFinish(controller: UIViewController) 
} 

extension DismissalDelegate where Self: UIViewController { 
    func selectionDidFinish(viewController: UIViewController) { 
    self.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

私は公開することはできません@objcへの私のプロトコル拡張 - なぜこれが機能しないのですか?私の#selectorは本当にここで問題になっていますか?それは私のプロトコルと関係がありますか?

EDIT:

func dismiss() { 
    dismissalDelegate?.selectionDidFinish(self) 
} 

をし、このようにセレクタと呼ばれる::最終修正

受け入れ答えに基づいて、私は解雇を行うための機能を追加しました

答えて

3

actionパラメータに任意の式を指定することはできません。特定のセレクタ(そのクラスのクラスと関数)を呼び出す必要があります。

あなたはデリゲートメソッド呼び出しクラス内の関数を作成する必要があります:Xcodeの名前あなたが前に入力されたクラスの任意の既知の方法でも、オートコンプリートすることを限度に...

class FormulaInfoViewController: UIViewController, Dismissable { 

    weak var dismissalDelegate: DismissalDelegate? 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(FormulaInfoViewController.selectionDidFinish) 
    } 

    @objc func selectionDidFinish() { 
     self.dismissalDelegate?.selectionDidFinish(self) 
    } 
} 
+0

を"。" Objective-C(またはSwift 2.2)のようなものではなく、実行時に文字列を渡してクラッシュさせることができます。 :-) –

関連する問題