質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

885閲覧

ViewControllerのinitializeのNSCoderで何を渡せばいいのかわからない

hodoru3sei

総合スコア284

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/02/21 05:54

編集2021/02/21 06:16

実現したいこと

XLPagerTabStripというライブラリを使って上タブを実装しているのですが、今回下タブも追加したいと思いUITabBarControllerの上にXLPagerTabStripで作った上タブをのせたいと考えています

困っていること

TabBarに追加する時のinitialize引数でNSCoderを渡す必要があるのですがこれにいったい何を渡せばいいのかわからず困っています。

TabBarのコードは以下です。Rootで開くVCをSceneDelegateでTabViewControllerにしているのでrequired initは通らずに普通のinitで初期化されてしまう為NSCoderをinit時に取得することができません。

どうしたらいいのでしょうか?

swift

1class TabViewController: UITabBarController { 2 3 init(){ 4 super.init(nibName: String(describing: TabViewController.self), bundle: nil) 5 } 6 7 required init?(coder aDecoder: NSCoder) { 8 super.init(coder: aDecoder) 9 } 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 var viewControllers: [UIViewController] = [] 15 let firstViewController = UINavigationController(rootViewController: UpperTabListBaseViewController(coder: // ここにい何を入れていいのかわからない)) 16 firstViewController.tabBarItem = UITabBarItem(title: "ホーム", image: #imageLiteral(resourceName: "home"), tag: 1) 17 viewControllers.append(firstViewController) 18 } 19} 20

追記

UpperTabListBaseViewControllerのコードです

class UpperTabListBaseViewController: BaseButtonBarPagerTabStripViewController<UpperTabStockDayCollectionViewCell> { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) buttonBarItemSpec = ButtonBarItemSpec.nibFile(nibName: "UpperTabStockDayCollectionViewCell", bundle: Bundle(for: UpperTabStockDayCollectionViewCell), width: { _ in return 70 }) let cellHeight: CGFloat = 50 let statusBarHeight = UIApplication.shared.statusBarFrame.height settings.style.buttonBarHeight = cellHeight + statusBarHeight settings.style.buttonBarBackgroundColor = .lightGray } override func viewDidLoad() { super.viewDidLoad() } override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { return [ StockListViewController(itemInfo: IndicatorInfo(image: UIImage(named: "main-icon"))), OneWeekStockListViewController(itemInfo: IndicatorInfo(image: UIImage(named: "monday")), dayOfTheWeek: .monday), OneWeekStockListViewController(itemInfo: IndicatorInfo(image: UIImage(named: "tuesday")), dayOfTheWeek: .tuesday), OneWeekStockListViewController(itemInfo: IndicatorInfo(image: UIImage(named: "wednesday")), dayOfTheWeek: .wednesday), OneWeekStockListViewController(itemInfo: IndicatorInfo(image: UIImage(named: "thursday")), dayOfTheWeek: .thursday), OneWeekStockListViewController(itemInfo: IndicatorInfo(image: UIImage(named: "friday")), dayOfTheWeek: .friday), OneWeekStockListViewController(itemInfo: IndicatorInfo(image: UIImage(named: "saturday")), dayOfTheWeek: .saturday), OneWeekStockListViewController(itemInfo: IndicatorInfo(image: UIImage(named: "sunday")), dayOfTheWeek: .sunday) ] } override func configure(cell: UpperTabStockDayCollectionViewCell, for indicatorInfo: IndicatorInfo) { cell.image.image = indicatorInfo.image?.withRenderingMode(.alwaysOriginal) } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/02/21 06:05

NSCoder は storyboard から生成する時に使われるものなので、コードで生成する場合は不要なはずですが、UpperTabListBaseViewController のソースはどうなってますか?
hodoru3sei

2021/02/21 06:18

ありがとうございます!UpperTabListBaseViewControllerのコードを追加しました ライブラリの方でストーリーボードからの生成がされる前提で作られてるんですかね? この場合TabBarってくっつけることできないんでしょうか?
hoshi-takanori

2021/02/21 07:15

BaseButtonBarPagerTabStripViewController には init が二つあって、init(nibName:,bundle:) の方を使えば init?(coder:) は不要な気がしますが、その場合は xib ファイルからビューを生成することになるのかな…。 https://github.com/xmartlabs/XLPagerTabStrip/blob/master/Sources/BaseButtonBarPagerTabStripViewController.swift ちなみに、init(nibName:,bundle:) や ButtonBarItemSpec.nibFile(nibName:bundle:width:) などの bundle 引数は通常 nil を指定すると Bundle.main が使われると思います。
hodoru3sei

2021/02/21 08:59

ありがとうございます!! 解決できました
TsukubaDepot

2021/02/21 09:09

横からすみません。 XLPagerTabStrip を使う ViewController( ButtonBarPagerTabStripViewControllerを継承したクラス) のデザインは、Storyboard を使うことを「強く」推奨されています。 もしかして、 http://harumi.sakura.ne.jp/wordpress/2020/12/23/xlpagertabstrip%E3%81%A7%E4%B8%8A%E3%82%BF%E3%83%96%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B/ を参考にされたのかもしれません。 ここには明確には書かれていませんが、おそらくこのページの実装も最終的には StoryBoard を使って実装されているように感じます。 一応、今やってみた感じだと、StoryBoard を使わなくとも実装はできそうです(強引ですが)。 その場合、init?(coder:) は使わずに、中に記載されている内容を super.viewDidLoad() の直前に持ってくる必要があるようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問