2017-06-30 12 views
0

入力アクセサリビューをオーバーライドしても、UIToolbarが最初のビューコントローラに表示されるバグが発生しました。入力アクセサリビューが別のビューコントローラに誤って表示される

まずビューコントローラ:

class FirstViewController: BaseViewController { 

    @IBOutlet weak var toolbar: UIToolbar! 

    override var inputAccessoryView: UIView? { 
     return toolbar 
    } 

    ... 

第2のビューコントローラ:

class SecondViewController: BaseViewController { 

    override var inputAccessoryView: UIView? { 
     return nil 
    } 

    ... 

第三ビューコントローラ:私はに表示されるツールバーを原因となっているのか不明だ

class ThirdViewController: BaseViewController { 

    override var inputAccessoryView: UIView? { 
     return nil 
    } 

    ... 

第2のビューコントローラ。これらのビューコントローラはUINavigationControllerには組み込まれていないので、別の画面にどのように持ちこたえるか分かりません。

+0

少し不思議そうです - 'FirstViewController'のようなサウンドはレスポンダとして決して退くことはないので、入力アクセサリビューは"存在し続けます。 "おそらく 'FirstViewController'の' viewWillDisappear() 'に' resignFirstResponder() 'を入れますか? – DonMag

+0

@DonMagこれはうまくいったが、これはうまくいかない別のケースを見つけた。 UINavigationControllerに別のビューコントローラを表示すると、前の2つの画面から入力アクセサリビューが表示されます。これは非常に奇妙な状況です。 –

答えて

0

これは解決するのが難しい問題でしたが、私は結局問題を理解しました。

したがって、問題は方法canBecomeFirstResponderです。私たちは私たちのストーリーボードを設計する場合、次のように:私たちはThirdViewControllerにセグエとき、それは最初の応答者になることができるかどう

FirstViewController -(show)-> SecondViewController -(show)-> ThirdViewController

、iOSのはFirstViewControllerを要求します。 canBecomeFirstResponderがtrueを返す場合、入力アクセサリビューFirstViewControllerThirdViewControllerに表示されます。

解決策は、残念ながら、ちょっとハッキリですが、私が今考えている唯一の解決策です。

ベースビュー・コントローラ:

class BaseViewController: UIViewController { 

    var shouldBecomeFirstResponder: Bool = false 

    override var canBecomeFirstResponder: Bool { 
     return shouldBecomeFirstResponder 
    } 

    ... 
} 

まずビューコントローラ:

class FirstViewController: BaseViewController { 

    @IBOutlet weak var toolbar: UIToolbar! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     shouldBecomeFirstResponder = true 
    } 

    override var inputAccessoryView: UIView? { 
     return toolbar 
    } 

    @IBAction didTap() { 
     shouldBecomeFirstResponder = false 
     performSegue(withIdentifier: "showSecond", sender: self) 
    } 
    ... 
} 

第2のビューコントローラ:

class SecondViewController: BaseViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     shouldBecomeFirstResponder = false 
    } 
    ... 

    @IBAction didTap() { 
     performSegue(withIdentifier: "showThird", sender: self) 
    } 

    ... 
} 

第ビューコントローラ:

class ThirdViewController: BaseViewController { 

    ... 
} 
関連する問題