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

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

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

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

Swift

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

Q&A

解決済

1回答

1438閲覧

「Tabman」に関するコード・storyboardの設定・xcodeの設定に関する質問

samson66

総合スコア35

Xcode

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

Swift

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

0グッド

1クリップ

投稿2019/07/26 11:05

編集2019/08/04 16:52

イメージ説明

コード全文

Swift4.0

1import UIKit 2import Tabman 3import Pageboy 4 5class TabViewController: TabmanViewController,PageboyViewControllerDataSource, TMBarDataSource { 6 7 func barItem(for bar: TMBar, at index: Int) -> TMBarItemable { 8 return viewControllers[2] as! TMBarItemable 9 } 10 11 func numberOfViewControllers(in pageboyViewController: PageboyViewController) -> Int { 12 return viewControllers.count 13 } 14 15 func viewController(for pageboyViewController: PageboyViewController, 16 at index: PageboyViewController.PageIndex) -> UIViewController? { 17 return viewControllers[index] 18 } 19 20 func defaultPage(for pageboyViewController: PageboyViewController) -> PageboyViewController.Page? { 21 return nil 22 } 23 24 func barItem(for tabViewController: TabmanViewController, at index: Int) -> TMBarItemable { 25 let title = "Page (index)" 26 return TMBarItem(title: title) 27 } 28 29 private var viewControllers = [ViewController1(), UIViewController2(),UIViewController3()] 30 31 override func viewDidLoad() { 32 super.viewDidLoad() 33 34 self.dataSource = self 35 36 // Create bar 37 let bar = TMBar.ButtonBar() 38 bar.layout.transitionStyle = .snap // Customize 39 40 // Add to view 41 addBar(bar, dataSource: self, at: .top) 42 } 43} 44

実現したいことは「Tabman」と言われるモジュールで画面を切り替えるページングメニューバーを作ることです。
以下の公式の手順通りに現在開発を進めています。(英語です)
https://uias.github.io/Tabman/master/index.html

このような実行結果を期待しています。
イメージ説明

画面構成は自分でview controllersを配置してセグエでTabViewControllerからそれぞれ繋げて構成してみました。
イメージ説明

初歩的・大雑把な質問で申し訳ございません。
解決に繋がりそうなアドバイスなどなんでもお待ちしています。
ぜひご教授願い致しますm(_ _)m

追記 タブの表示に成功(レイアウトは反映されず)
イメージ説明

8/1 追記 掲載されたプロジェクトを参考に進めましたが、AppDelegateでエラーが発生
イメージ説明

8/3 追記 コンソールのメッセージ

2019-08-03 02:12:38.319389+0900 tabbar[63029:2060250] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'Main' in bundle NSBundle </Users/tomoya/Library/Developer/CoreSimulator/Devices/A5979362-CDD8-43C7-887C-D00D530C75C1/data/Containers/Bundle/Application/32D75E3C-A0CA-4FB9-9CAA-C2B997081DA6/tabbar.app> (loaded)' *** First throw call stack: ( 0 CoreFoundation 0x00000001108381bb __exceptionPreprocess + 331 1 libobjc.A.dylib 0x000000010f2ed735 objc_exception_throw + 48 2 UIKitCore 0x00000001153df27a +[UIStoryboard storyboardWithName:bundle:] + 676 3 UIKitCore 0x000000011523e016 -[UIApplication _loadMainStoryboardFileNamed:bundle:] + 76 4 UIKitCore 0x000000011523e50c -[UIApplication _loadMainInterfaceFile] + 272 5 UIKitCore 0x000000011523cb25 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1357 6 UIKitCore 0x0000000114a5b4e9 __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke + 866 7 UIKitCore 0x0000000114a6429c +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] + 153 8 UIKitCore 0x0000000114a5b126 -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 233 9 UIKitCore 0x0000000114a5bae0 -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 1085 10 UIKitCore 0x0000000114a59cb5 __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 795 11 UIKitCore 0x0000000114a5995f -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 435 12 UIKitCore 0x0000000114a5ea90 __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 584 13 UIKitCore 0x0000000114a5f80e _performActionsWithDelayForTransitionContext + 100 14 UIKitCore 0x0000000114a5e7ef -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 221 15 UIKitCore 0x0000000114a6393a -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 392 16 UIKitCore 0x000000011523b44e -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 515 17 UIKitCore 0x0000000114ddfd09 -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 357 18 FrontBoardServices 0x000000011b0dc2da -[FBSSceneImpl _didCreateWithTransitionContext:completion:] + 448 19 FrontBoardServices 0x000000011b0e7443 __56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2 + 271 20 FrontBoardServices 0x000000011b0e6b3a __40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 53 21 libdispatch.dylib 0x00000001128f2602 _dispatch_client_callout + 8 22 libdispatch.dylib 0x00000001128f5b78 _dispatch_block_invoke_direct + 301 23 FrontBoardServices 0x000000011b11bba8 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 30 24 FrontBoardServices 0x000000011b11b860 -[FBSSerialQueue _performNext] + 457 25 FrontBoardServices 0x000000011b11be40 -[FBSSerialQueue _performNextFromRunLoopSource] + 45 26 CoreFoundation 0x000000011079d721 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 27 CoreFoundation 0x000000011079cf93 __CFRunLoopDoSources0 + 243 28 CoreFoundation 0x000000011079763f __CFRunLoopRun + 1263 29 CoreFoundation 0x0000000110796e11 CFRunLoopRunSpecific + 625 30 GraphicsServices 0x0000000118e451dd GSEventRunModal + 62 31 UIKitCore 0x000000011523e81d UIApplicationMain + 140 32 tabbar 0x000000010e7b8467 main + 71 33 libdyld.dylib 0x0000000112968575 start + 1 34 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

8/5 追記:ついに成功できました(涙) 本当に教えていただきありがとうございましたm(_ _)m
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因はUIViewControllerを強制キャストでTMBarItemableとして取り出そうとしているからだと思います。
以下の箇所ですね。

Swift

1func barItem(for bar: TMBar, at index: Int) -> TMBarItemable { 2 return viewControllers[2] as! TMBarItemable 3}

ここにはバーに表示するタイトルを設定します。
TMBarItemがバーに表示するタイトルなどに該当します。

ちょっと書き方が間違っているので、以下のように修正してみてください。

Swift

1func barItem(for bar: TMBar, at index: Int) -> TMBarItemable { 2 return TMBarItem(title: "Page (index)") 3}

またviewControllersですが、
StoryboardからViewControllerを生成するようにしないとStoryboardで作ったレイアウトが反映されないんじゃないかなと思います。

簡単にですがサンプルプロジェクトを作ってみたので、
よければ参考にしてみてください。

追記(2019/08/01)

レイアウトが反映されない件についてですが、
現状は以下のようにしてviewControllersに表示したいViewControllerを生成していると思います。

swift

1private var viewControllers = [ViewController1(),UIViewController2(),UIViewController3()]

これではViewController1UIViewController2などをStoryboardから生成したことにはなりません。

Storyboardで作ったレイアウトを反映したViewControllerを生成したい場合、
StoryboardからViewControllerを生成する必要があります。

サンプルプロジェクトでは以下のようにしてStoryboardからViewControllerを生成しています。
ついでに参考になりそうなサイト

Swift

1 // Tabmanで表示するViewControllerを生成 2 guard let firstVC = UIStoryboard(name: "FirstViewController", bundle: nil).instantiateInitialViewController(), 3 let secondVC = UIStoryboard(name: "SecondViewController", bundle: nil).instantiateInitialViewController() else { 4 return 5 } 6

現在は一つのStoryboardに複数のViewControllerを定義しているみたいですが

個人的には画面が増えるごとにStoryboardが重くなるのと、
Storyboard上の特定のViewControllerだけ生成したい場合面倒なので
1つのStoryboardには1つのViewControllerだけを定義するようにすることをお勧めします。

追記(2019/08/03)

プロジェクトとエラーの記載ありがとうございます!

まずエラーですが、
以下のようなエラーが出ています。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'Main' in bundle NSBundle

MainというStoryboard(デフォルトで一番最初に作られるStoryboardですね)が見つからなくて落ちているようです。
プロジェクトを確認したところ、Xcodeの設定のMain InterfaceMainになっていました。
(Main Interfaceはアプリ起動時に一番最初に表示するViewControllerを設定する項目です)

Xcodeの設定

これをTabViewControllerなど自分が表示させたいViewControllerに変えてみたらエラーは解消されると思います。

落ちた場合には大概エラーがコンソールに表示されるので、
1度目を通してみることをお勧めします。エラーをそのままコピペして検索すると解決策が出てくるかもしれませんしね。

投稿2019/07/26 18:52

編集2019/08/03 00:21
hayabusabusash

総合スコア767

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

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

samson66

2019/08/01 05:25

返信、かなり遅くなってしまい申し訳ございませんでした・・・。 そして前回に引き続き、ご回答頂き大変恐縮です。 サンプルプロジェクトの方まで載せてわざわざ全てに解説を付けて頂き、余すことなく理解できましたm(_ _)m 公式に載っている4番目のメソッドと自動で生成されたメソッドの違いがわからずに進めてしまったのが失敗でした。またメソッドの意味の一つ一つもわからないまま進めていましたm(_ _)m [公式に載ってるメソッド] func barItem(for tabViewController: TabmanViewController, at index: Int) -> TMBarItemable { let title = "Page (index)" return TMBarItem(title: title) } [自動で生成されたメソッド] func barItem(for bar: TMBar, at index: Int) -> TMBarItemable { (CODE) } 上の自動で生成されたメソッドに回答の返り値を入れたところようやくバーが表示できました! return TMBarItem(title: "Page (index)") しかしご指摘の通り、Storyboardで作ったレイアウトは全く反映されませんでした。
hayabusabusash

2019/08/01 05:37

レイアウトが反映されない件について追記しますので、少々お待ちください。
samson66

2019/08/01 13:08 編集

本当にありがとうございますm(_ _)m それと追記なのですが、載せて頂いたプロジェクトを参考に storyboardのファイルを2つ生成し(FirstViewController.storyboardとSecondViewController.storyboard)、viewcontrollerも2つ生成しCustom ClassをFirstViewController.swiftとSecondViewController.swiftに設定し、同じ様に実行してみたのですがAppDelegate.swiftで「Thread 1: signal SIGABRT」エラーが発生し実行できませんでした。 これ以外にエラーは発生していません。
hayabusabusash

2019/08/01 14:18

ご確認ありがとうございます! なるほど...ちょっとそれだけだとなぜエラーになるのかがわからないので、 変更した部分のコードがあればそれを載せていただくか、 もしくは他のStoryboardのOutlet参照が上手くいっているか(今回の変更以外でそもそもエラーが出ていないか)を確認するなどをしていただけないでしょうか?
hayabusabusash

2019/08/02 11:25

貼っていただいたスクショを見ると、コンソールにエラーが出ているので、 それをコピペして貼っていただくことはできますか?
samson66

2019/08/02 17:33

githubにプロジェクトファイルを初めて上げようとして色々調べていました・・。 うまくいってないかもしれないですが、一応こちらに今回のプロジェクトファイルが存在すると思いますm(_ _)m https://github.com/camelmac66/tabpro またコードの変更は特にありません。 StoryboardのOutlet参照については特に何も触ってない状態です。 コンソールの件、追記に載せておきますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問