2017-04-15 6 views
0

私のViewControllerが以前inputAccessoryViewとしたのUIViewの再利用、doesntのは

  1. UITextViewと
  2. バーと呼ばれる簡単なUIViewの変数が含まれて働くように見えます。
  3. textViewShouldBeginEditingで

()私はのViewControllerのビューからバーを削除し、TextViewののinputAccessoryViewとして設定:予想通り

bar.removeFromSuperview() 
textView.inputAccessoryView = bar 
textView.reloadInputViews() 

これは動作します。その後 私はTextViewののinputAccessoryViewからバーを削除して、このように、バックのViewControllerのビューにそれをピットendEditing呼び出す:

textView.inputAccessoryView = nil 
textView.reloadInputViews() 
bar.frame = CGRect(x:0,y:500,width:100,height:50) 
view.addSubview(bar) 

しかしバーはのViewControllerのビューに戻って表示されません。私が間違っているつもりです


bar.window: Optional(<UIWindow: 0x7faa79608d50; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = <NSArray: 0x600000048fa0>; layer = <UIWindowLayer: 0x600000036f20>>) 

bar.superview: Optional(<UIView: 0x7faa794141c0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x60800023a800>>) 

dump(bar): 
▿ Optional(<UIView: 0x7faa7940faf0; frame = (0 500; 100 50); layer = <CALayer: 0x608000037940>>) 
    - some: <UIView: 0x7faa7940faf0; frame = (0 500; 100 50); layer = <CALayer: 0x608000037940>> #0 
    - super: UIResponder 
     - super: NSObject 

:ここでは、画面に表示されないプロセスの最後にバーのダンプがありますか?ここ

が私のViewControllerのコードです:

class ViewController: UIViewController, UITextViewDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     bar = UIView() 
     bar.frame = CGRect(x:0,y:500,width:100,height:50) 
     bar.backgroundColor = UIColor.red 
     //setToolBar() 
     textView.delegate = self 
    } 

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

    @IBOutlet weak var textView: UITextView! 

    var bar: UIView! 


    func setToolBar() { 
     bar.frame = CGRect(x:0,y:500,width:100,height:50) 
     view.addSubview(bar) 
     textView.inputAccessoryView = nil 
     textView.reloadInputViews() 


     print("-----------------------\n"); 
     print("cust.window: ", bar.window) 
     print("cust.superview: ", bar.superview) 
     print("dump: ") 
     dump(bar) 
     print("\n-----------------------\n") 
    } 

    func dismissKeyboard() { 
     self.view.endEditing(true) 

     print("ABOUT TO SET TOOLBAR ") 
     setToolBar() 
     print("JUST SET TOOLBAR ") 
    } 


    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool { 
     bar.removeFromSuperview() 
     print("here") 
     dump(bar) 
     textView.inputAccessoryView = bar 
     textView.reloadInputViews() 
     return true 
    } 

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { 
     if(text == "\n") { 
      print("FRAME:", bar.frame) 
      //textView.inputAccessoryView = nil 
      //textView.inputView = nil 
      //textView.reloadInputViews() 

      dismissKeyboard() 

      return false 
     } 
     return true 
    } 

} 
+0

これ以上ios 11では何も起こっていないようです。ありがとう! – aunindo

答えて

0

nilにinputAccessoryViewを設定することで、ビューの割り当てを解除していないしている、あなたはそれを再利用しようとすると、それはもう存在しません。最初にサブビューとして追加してから、inputAccessoryViewをnilに設定してみてください。

+1

私は画面上に表示されていない瞬間にダンプを呼び出すことができるので、ビュー(バー)の割り当てが解除されているかどうかはわかりません。また、次回にtextViewをクリックすると、アクセサリビューにビュー(バー)が表示されます。キーボードが倒れたときにのみ、ビュー(棒)が消えます。また、ViewControllerコードではbarという名前の変数によって参照されます。私は何を示唆しましたが、観察に変化はありませんでした – aunindo

関連する問題