初期ウィンドウとして UITabbarController を持つアプリがあります(ログイン後、rootViewControllerとして設定します)
この tabbarController には 4 つの異なるタブがあり、これらはすべて UINavigationController に埋め込まれた UIViewController です。
私の tabbarController では、初期構成を行っているときに、次のようにタブを設定します。
まず、viewController を作成します。
let tableViewController1 = tableViewController1(nibName: "tableViewController1", bundle: nil) let tableViewController2 = tableViewController2(nibName: "tableViewController2", bundle: nil) let tableViewController3 = tableViewController3(nibName: "tableViewController3", bundle: nil) let profileViewController = ProfileViewController(nibName: "ProfileViewController", bundle: nil)
次に、それらを navigationControllers 内に埋め込みます。
let navController1 = UINavigationController(rootViewController: tableViewController1) let navController2 = UINavigationController(rootViewController: tableViewController2) let navController3 = UINavigationController(rootViewController: tableViewController3) let navController4 = UINavigationController(rootViewController: profileViewController)
最後に、navigationControllers を tabbarController の viewControllers として追加します。
viewControllers = [navController1,navController2,navController3,navController4]
私はそれをオンラインで調べましたが、この使用方法は正しいようです。例: https://medium.com/@ITZDERR/uinavigationcontroller-and-uitabbarcontroller-programmatically-swift-3-d85a885a5fd0 . ただし、以下のようにライブ アプリからクラッシュ ログを受信しています
Crash, child view controller:<UINavigationController: 0x160b3400>
should have parent view controller:<ProfileViewController: 0x16098800>
but actual parent is:<MyApp.MainTabBarController: 0x16064c00>
ここでの問題は、クラッシュが profileViewController が navigationController の親である必要があることを示していますが、profileViewController を navigationController 内に埋め込み、tabbarController の viewControllers として追加したため、私の意見では順序が正しいことです。
このクラッシュを検索したところ、addChildViewController を使用するか、どこかで親を削除するステップをスキップしているようですが、わかりませんでした。
これへの関連リンクを見つけましたが、それらのどれもがこの問題を解決するのに役立ちませんでした。
リンクの例: