2017-09-28 21 views
1

UIViewControllersの間でいくつかのアニメーションをテストしようとしています。この特定のケースでは、子ビューとして別のUIVCを追加するUIViewControllerがあります。子ビューコントローラを親から削除すると、アプリケーションがクラッシュする

すべてが期待どおりに動作し、子ビューが追加されて表示され、子供ビューでは私はUINavigationBarを持っています。左ボタンのボタンとしてキャンセルボタン(dismiss)があります。

私はそのボタンをクリックすると、(親ビューからの)ビュー階層からこの提示された子ビューを削除しようとする機能を起動します。

親ビューからコード:

// ViewController -> Parent 

lazy var presentButton: UIButton = { 
    let b = UIButton(type: .custom) 
    b.setTitle("Present", for: .normal) 
    b.setTitleColor(.black, for: .normal) 
    b.addTarget(self, action: #selector(didTapPresentButton), for: .touchUpInside) 
    return b 
}() 

lazy var childViewController: PresentedViewController = { 
    let viewController = PresentedViewController() 
    return viewController 
}() 


@objc func didTapPresentButton() { 
    addViewControllerAsChildViewController(childViewController: childViewController)  
} 


func addViewControllerAsChildViewController(childViewController: UIViewController) { 
    self.addChildViewController(childViewController) 
    childViewController.view.frame = CGRect.zero 

    self.view.addSubview(childViewController.view) 

    let newFrame = view.bounds 
    UIView.animate(withDuration: 2) { 
     childViewController.view.frame = newFrame 
    } 
    childViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
    childViewController.didMove(toParentViewController: self) 
} 

あなたが上記を参照したように、私は、現在のボタンをクリックしたとき、それは子ビューをインスタンス化し、これまでのところ、とても良いそれをアニメーション化します。

子ビューコード:私はキャンセルボタンをクリックすると、子ビューに今

// ChildViewController -> Child (ofc) 

@objc func didTapCancel() { 
    self.willMove(toParentViewController: nil) 
    self.view.removeFromSuperview() 
    self.removeFromParentViewController() 
} 

は、私はそれが適切に削除されるためにremoveFromParentViewController()を呼び出す必要があります知っているが、アプリがクラッシュした場合はI followinggエラーではないこと:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[dismissLayerTest.ChildViewController name]: unrecognized selector sent to instance 0x7fea2f60a920' 

それから私はself.removeFromParentViewController()行をコメントしようとした、そしてそうすることで、アプリがクラッシュしませんが、その後、親ビューコントローラに私は、ビューはまだであることがわかりますその親に印刷することによって添付するself.childViewControllers.countと私は1を示しています。

どこに問題がありますか?

ありがとうございました

+1

エラーの原因を特定するために、コード内の「名前」を検索してください。 –

+0

@YunCHEN「名前」のプロパティまたはメソッドコールはありません。/ –

+0

このリンクを参考にしてください:https://stackoverflow.com/questions/46196201/how-to-transfer-data-between-parent-and -child-view-controllers?answertab = active#tab-top –

答えて

0

私はどこに問題があるのか​​把握しています。

いくつかのテストの後で、parent-child View Controllersを使用している間にlazyインスタンシエーションを使用しないでください。私はparentViewControllerからエラーがそれを削除しようとしたとき、私はlazyとしてchildViewControllerをインスタンス化するので

unrecognized selector sent to instanceので、私は、プロパティのポインタセレクタは何とかそれが何だったか子供を知っていませんでしたparentViewControllerに割り当てが解除されたことが分かりましたそれはその参照を失ったので、却下する。

これを修正するために、lazyインスタンスを削除しました。そのため、スコープは常に変更されず、親スコープから子を正常に削除できます。

var childViewController: ChildViewController = { 
    let viewController = ChildViewController() 
    return viewController 
}() 
関連する問題