Swiftで親ビューコントローラーからコンテナーVC子にデータを複数回渡す方法は?

プレートリバーブ

ViewControllerA(親)に、ViewControllerB(子)内の変数を更新するボタンがあります。ViewControllerBは、ViewControllerA内のコンテナビューです。

これは、親のViewControllerAボタンを押してから複数回更新したいViewControllerBの変数です。

@IBOutlet weak var childViewHeight: NSLayoutConstraint!

子ビューViewControllerBは埋め込みセグエによって接続されているため、prepareForSegueメソッドを介してViewControllerAからViewControllerBにデータを渡すことができるのは1回だけのようです。このperformSegueメソッドにより、プログラムがSIGABRTエラーでクラッシュします。

IBOutlet別のクラスまたはViewControllerからを更新しようとするのは一般的に悪い習慣と考えられていますが、ViewControllerAのボタンを押してViewControllerAとViewControllerBの高さの制約を同時に変更する方法が必要です。

私の現在のアプローチではこれが不可能な場合は、これを可能にするためにアプリを再設計する方法について別の提案をお願いします。

更新-これはクラッシュの原因となるコードです:

@IBAction func button(_ sender: AnyObject) {
    performSegue(withIdentifier: "seg", sender: self)
}

更新-デバッグコンソールに「bt」と入力したときの結果は次のとおりです。

* thread #1: tid = 0x1fcdd, 0x000000010d9b1f06 libsystem_kernel.dylib`__pthread_kill + 10, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
frame #0: 0x000000010d9b1f06 libsystem_kernel.dylib`__pthread_kill + 10
frame #1: 0x000000010dad24ec libsystem_pthread.dylib`pthread_kill + 90
frame #2: 0x000000010d7040b3 libsystem_c.dylib`abort + 129
frame #3: 0x000000010d9d043a libc++abi.dylib`abort_message + 266
frame #4: 0x000000010d9f4a9f libc++abi.dylib`default_terminate_handler() + 267
frame #5: 0x000000010c7b559f libobjc.A.dylib`_objc_terminate() + 103
frame #6: 0x000000010d9f1c09 libc++abi.dylib`std::__terminate(void (*)()) + 8
frame #7: 0x000000010d9f1894 libc++abi.dylib`__cxa_rethrow + 99
frame #8: 0x000000010c7b54b7 libobjc.A.dylib`objc_exception_rethrow + 40
frame #9: 0x000000010a2eebf1 CoreFoundation`CFRunLoopRunSpecific + 433
frame #10: 0x000000010f6d7a48 GraphicsServices`GSEventRunModal + 161
frame #11: 0x000000010ad27e8b UIKit`UIApplicationMain + 159
* frame #12: 0x000000010a1c60cf ContainerVC2`main + 111 at AppDelegate.swift:12
frame #13: 0x000000010d6586bd libdyld.dylib`start + 1

更新-例外ブレークポイントが設定された「bt」コンソール出力は次のとおりです。

* thread #1: tid = 0x219bd, 0x000000010afca2ee libobjc.A.dylib`objc_exception_throw, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x000000010afca2ee libobjc.A.dylib`objc_exception_throw
frame #1: 0x0000000108b7dec2 CoreFoundation`+[NSException raise:format:arguments:] + 98
frame #2: 0x0000000109079455 Foundation`-[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195
frame #3: 0x0000000109f65309 UIKit`__67-[UIStoryboardEmbedSegueTemplate newDefaultPerformHandlerForSegue:]_block_invoke + 438
frame #4: 0x0000000109ce05e4 UIKit`-[UIStoryboardSegueTemplate _performWithDestinationViewController:sender:] + 453
frame #5: 0x0000000109ce03ee UIKit`-[UIStoryboardSegueTemplate _perform:] + 82
frame #6: 0x00000001096dc45b UIKit`-[UIViewController performSegueWithIdentifier:sender:] + 99
* frame #7: 0x00000001089d99b3 ContainerVC2`ViewController1.button(sender=0x00007fff57224658, self=0x00007fcddb707cb0) -> () + 131 at ViewController.swift:9
frame #8: 0x00000001089d9a26 ContainerVC2`@objc ViewController1.button(AnyObject) -> () + 54 at ViewController.swift:0
frame #9: 0x000000010953eb6f UIKit`-[UIApplication sendAction:to:from:forEvent:] + 83
frame #10: 0x00000001096bf927 UIKit`-[UIControl sendAction:to:forEvent:] + 67
frame #11: 0x00000001096bfc08 UIKit`-[UIControl _sendActionsForEvents:withEvent:] + 388
frame #12: 0x00000001096be6aa UIKit`-[UIControl touchesBegan:withEvent:] + 414
frame #13: 0x00000001095aabbd UIKit`-[UIWindow _sendTouchesForEvent:] + 1188
frame #14: 0x00000001095ac8d6 UIKit`-[UIWindow sendEvent:] + 3984
frame #15: 0x000000010955a1e1 UIKit`-[UIApplication sendEvent:] + 281
frame #16: 0x0000000109d1502f UIKit`__dispatchPreprocessedEventFromEventQueue + 3314
frame #17: 0x0000000109d0dc4e UIKit`__handleEventQueue + 4879
frame #18: 0x0000000108b1fcb1 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
frame #19: 0x0000000108b04c6c CoreFoundation`__CFRunLoopDoSources0 + 556
frame #20: 0x0000000108b04156 CoreFoundation`__CFRunLoopRun + 918
frame #21: 0x0000000108b03b5d CoreFoundation`CFRunLoopRunSpecific + 285
frame #22: 0x000000010deeca48 GraphicsServices`GSEventRunModal + 161
frame #23: 0x000000010953ce8b UIKit`UIApplicationMain + 159
frame #24: 0x00000001089db0cf ContainerVC2`main + 111 at AppDelegate.swift:12
frame #25: 0x000000010be6d6bd libdyld.dylib`start + 1

「プログラムの実行を続行」ボタンを1回押した後の「bt」の出力は次のとおりです。

* thread #1: tid = 0x219bd, 0x000000010c206607 libc++abi.dylib`__cxa_throw, queue = 'com.apple.main-thread', stop reason = breakpoint 1.2
frame #0: 0x000000010c206607 libc++abi.dylib`__cxa_throw
frame #1: 0x000000010afca443 libobjc.A.dylib`objc_exception_throw + 341
frame #2: 0x0000000108b7dec2 CoreFoundation`+[NSException raise:format:arguments:] + 98
frame #3: 0x0000000109079455 Foundation`-[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195
frame #4: 0x0000000109f65309 UIKit`__67-[UIStoryboardEmbedSegueTemplate newDefaultPerformHandlerForSegue:]_block_invoke + 438
frame #5: 0x0000000109ce05e4 UIKit`-[UIStoryboardSegueTemplate _performWithDestinationViewController:sender:] + 453
frame #6: 0x0000000109ce03ee UIKit`-[UIStoryboardSegueTemplate _perform:] + 82
frame #7: 0x00000001096dc45b UIKit`-[UIViewController performSegueWithIdentifier:sender:] + 99
* frame #8: 0x00000001089d99b3 ContainerVC2`ViewController1.button(sender=0x00007fff57224658, self=0x00007fcddb707cb0) -> () + 131 at ViewController.swift:9
frame #9: 0x00000001089d9a26 ContainerVC2`@objc ViewController1.button(AnyObject) -> () + 54 at ViewController.swift:0
frame #10: 0x000000010953eb6f UIKit`-[UIApplication sendAction:to:from:forEvent:] + 83
frame #11: 0x00000001096bf927 UIKit`-[UIControl sendAction:to:forEvent:] + 67
frame #12: 0x00000001096bfc08 UIKit`-[UIControl _sendActionsForEvents:withEvent:] + 388
frame #13: 0x00000001096be6aa UIKit`-[UIControl touchesBegan:withEvent:] + 414
frame #14: 0x00000001095aabbd UIKit`-[UIWindow _sendTouchesForEvent:] + 1188
frame #15: 0x00000001095ac8d6 UIKit`-[UIWindow sendEvent:] + 3984
frame #16: 0x000000010955a1e1 UIKit`-[UIApplication sendEvent:] + 281
frame #17: 0x0000000109d1502f UIKit`__dispatchPreprocessedEventFromEventQueue + 3314
frame #18: 0x0000000109d0dc4e UIKit`__handleEventQueue + 4879
frame #19: 0x0000000108b1fcb1 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
frame #20: 0x0000000108b04c6c CoreFoundation`__CFRunLoopDoSources0 + 556
frame #21: 0x0000000108b04156 CoreFoundation`__CFRunLoopRun + 918
frame #22: 0x0000000108b03b5d CoreFoundation`CFRunLoopRunSpecific + 285
frame #23: 0x000000010deeca48 GraphicsServices`GSEventRunModal + 161
frame #24: 0x000000010953ce8b UIKit`UIApplicationMain + 159
frame #25: 0x00000001089db0cf ContainerVC2`main + 111 at AppDelegate.swift:12
frame #26: 0x000000010be6d6bd libdyld.dylib`start + 1

更新-prepareforsegueコード:

override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "seg" {
        var vcB: ViewControllerB?
        vcB = segue.desinationViewController as? ViewControllerB
}
Paulw11

performSegue埋め込みセグエを呼び出す必要はありません埋め込みセグエは、含まれているViewControllerがストーリーボードからロードされると自動的に起動されます。

prepareForSegue含まdestinationViewControllerれているViewControllerで使用して、含まれているView Controllerへの参照を取得できます(これはセグエに含まれます)。参照を取得したら、それをプロパティに格納し、それを使用して操作できます。制約を直接更新するのではなく、制約を更新するViewControllerの関数を呼び出すことをお勧めします。

class ViewControllerA: UIViewController {

    var viewControllerB: ViewControllerB?

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "seg" {
            self.viewControllerB = segue.destinationViewController as? ViewControllerB
        }
     }

     @IBAction func button(_ sender: AnyObject) {
         self.viewControllerB?.doSomethingWithHeight(newHeight)
     }
}



class ViewControllerB: UIViewController {

    @IBOutlet weak var childViewHeight: NSLayoutConstraint!

    func doSomethingWithHeight(newHeight: CGFloat) {
        self.childViewHeight.constant = newHeight
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

親ビューコントローラーから子コンテナービューコントローラーにデータを渡す方法

分類Dev

iOS-親ビューからコンテナビューのビューにデータを複数回渡す

分類Dev

親ビューからコンテナビューにデータを渡す

分類Dev

コンテナビューから親ビューコントローラに値を渡す

分類Dev

子ビューから親ビューコントローラーにデータをすばやく送信

分類Dev

Viewコントローラーからコンテナーにデータを渡す方法は?

分類Dev

Reactで親コンテナから子コンポーネントにAPIデータを渡す

分類Dev

Swiftのタブバーでテーブルビューからビューコントローラーにデータを渡す

分類Dev

親ビューコントローラーからSwiftの埋め込みビューコントローラーにデータを渡すにはどうすればよいですか?

分類Dev

テーブルビューからビューコントローラーにデータを渡す

分類Dev

Swift4でポップオーバーサブビューからビューコントローラーにデータを渡す方法

分類Dev

モデル全体(データを含む)をビューからコントローラーに渡す方法は?

分類Dev

コメント再生システムに親コメントIDを保存する方法(ビューからコントローラーに値を渡す方法は?)

分類Dev

ビューコントローラーからタブバーコントローラー、ナビゲーションコントローラーにデータを渡す方法は?

分類Dev

SwiftでのVCの問題の変更。タブバーコントローラーのビュー間でデータを渡す方法は?

分類Dev

親コントローラーから子コンポーネントに非同期データを渡すにはどうすればよいですか?

分類Dev

ビューからコントローラーにデータを渡す

分類Dev

ビューからコントローラーにデータを渡す

分類Dev

ビューからコントローラーにデータを渡すLaravel

分類Dev

選択したデータをビューからコントローラーに渡し、コントローラーからビューに戻す方法

分類Dev

Firebaseデータをテーブルビューセルからビューコントローラーに渡す方法は?

分類Dev

ビューデータをコントローラーに渡す方法は?

分類Dev

Codeigniter:コントローラーからビューに複数のデータ(配列や単一のデータなど)を渡す方法は?

分類Dev

UIStoryboardからインスタンス化されているテーブルビューコントローラーにデータを渡す方法は?

分類Dev

コントローラからのビューでjqueryにデータを渡す方法

分類Dev

コントローラのcodeigniterからビューにデータを渡す

分類Dev

Objectivecで他の子ビューコントローラーから子ビューコントローラーをナビゲートする方法

分類Dev

ASP.NET MVC:複雑なデータをビューからコントローラーに渡す

分類Dev

Swift2の親コントローラーからコンテナービューコントローラーにアクセスする

Related 関連記事

  1. 1

    親ビューコントローラーから子コンテナービューコントローラーにデータを渡す方法

  2. 2

    iOS-親ビューからコンテナビューのビューにデータを複数回渡す

  3. 3

    親ビューからコンテナビューにデータを渡す

  4. 4

    コンテナビューから親ビューコントローラに値を渡す

  5. 5

    子ビューから親ビューコントローラーにデータをすばやく送信

  6. 6

    Viewコントローラーからコンテナーにデータを渡す方法は?

  7. 7

    Reactで親コンテナから子コンポーネントにAPIデータを渡す

  8. 8

    Swiftのタブバーでテーブルビューからビューコントローラーにデータを渡す

  9. 9

    親ビューコントローラーからSwiftの埋め込みビューコントローラーにデータを渡すにはどうすればよいですか?

  10. 10

    テーブルビューからビューコントローラーにデータを渡す

  11. 11

    Swift4でポップオーバーサブビューからビューコントローラーにデータを渡す方法

  12. 12

    モデル全体(データを含む)をビューからコントローラーに渡す方法は?

  13. 13

    コメント再生システムに親コメントIDを保存する方法(ビューからコントローラーに値を渡す方法は?)

  14. 14

    ビューコントローラーからタブバーコントローラー、ナビゲーションコントローラーにデータを渡す方法は?

  15. 15

    SwiftでのVCの問題の変更。タブバーコントローラーのビュー間でデータを渡す方法は?

  16. 16

    親コントローラーから子コンポーネントに非同期データを渡すにはどうすればよいですか?

  17. 17

    ビューからコントローラーにデータを渡す

  18. 18

    ビューからコントローラーにデータを渡す

  19. 19

    ビューからコントローラーにデータを渡すLaravel

  20. 20

    選択したデータをビューからコントローラーに渡し、コントローラーからビューに戻す方法

  21. 21

    Firebaseデータをテーブルビューセルからビューコントローラーに渡す方法は?

  22. 22

    ビューデータをコントローラーに渡す方法は?

  23. 23

    Codeigniter:コントローラーからビューに複数のデータ(配列や単一のデータなど)を渡す方法は?

  24. 24

    UIStoryboardからインスタンス化されているテーブルビューコントローラーにデータを渡す方法は?

  25. 25

    コントローラからのビューでjqueryにデータを渡す方法

  26. 26

    コントローラのcodeigniterからビューにデータを渡す

  27. 27

    Objectivecで他の子ビューコントローラーから子ビューコントローラーをナビゲートする方法

  28. 28

    ASP.NET MVC:複雑なデータをビューからコントローラーに渡す

  29. 29

    Swift2の親コントローラーからコンテナービューコントローラーにアクセスする

ホットタグ

アーカイブ