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))
を見ることができない理由を私は理解できないdismissalDelegate
がFormulasTableViewController
に正しく設定取得していることが確認されました。
私は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)
}
をし、このようにセレクタと呼ばれる::最終修正
受け入れ答えに基づいて、私は解雇を行うための機能を追加しました
を"。" Objective-C(またはSwift 2.2)のようなものではなく、実行時に文字列を渡してクラッシュさせることができます。 :-) –