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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

2回答

750閲覧

XLPagerTabStrip利用時の変数の渡し方について

Y_M

総合スコア265

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クリップ

投稿2018/06/19 03:41

編集2018/06/19 04:36

前提・実現したいこと

XLPagerTabStripを利用して、3つタブのある画面を生成しています。
遷移元で非同期通信を行い、結果が帰ってきた際にその値をXLPagerTabStripで生成した画面に渡したいのですが、方法がわかりません。
AppDelegateや変数用のクラスを設ければ可能なのでしょうが、通常の遷移で下記のように実装している形で実装は出来ないのでしょうか?

swift

1let viewController = storyboard.instantiateViewController(withIdentifier: "Detail") as! DetailView 2viewController.detailText = sampleText 3navigationController?.pushViewController(viewController, animated: true)

該当のソースコード

swift

1// 遷移する際のコード 2 3func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 4 let viewController = storyboard.instantiateViewController(withIdentifier: "Sample") as! SampleBaseView 5 navigationController?.pushViewController(viewController, animated: true) 6}

swift

1// XLPagerTabStripのベースとなるページ 2 3import UIKit 4import XLPagerTabStrip 5 6class SampleBaseView: ButtonBarPagerTabStripViewController { 7 8 override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { 9 let firstVC = storyboard?.instantiateViewController(withIdentifier: "Tab1") 10 let secondVC = storyboard?.instantiateViewController(withIdentifier: "Tab2") 11 let thirdVC = storyboard?.instantiateViewController(withIdentifier: "Tab3") 12 let childViewControllers: [UIViewController] = [firstVC!, secondVC!, thirdVC!] 13 return childViewControllers 14 } 15 16}

swift

1// 表示するタブ1 2 3import UIKit 4import XLPagerTabStrip 5 6class Tab1: UIViewController { 7 8 var testText = "ここに渡したい" 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 print(testText) 14 } 15} 16 17extension Tab1: IndicatorInfoProvider { 18 func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { 19 return "タブ1" 20 } 21}

補足情報(FW/ツールのバージョンなど)

・Xcode9.4.1
・Swift4.1

###追記

swift

1let viewController = storyboard.instantiateViewController(withIdentifier: "Sample") as! SampleBaseView 2let detail = viewController.childViewControllers[0] as! Tab1 3detail.testText = "sampleString"

上記のようにやってみましたが下記のエラーになりました。
libc++abi.dylib: terminating with uncaught exception of type NSException」

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

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

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

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

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

guest

回答2

0

自己解決

swift

1// 遷移元ViewController 2 3func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 4 let viewController = storyboard.instantiateViewController(withIdentifier: "Sample") as! SampleBaseView 5 viewController.setViewController() 6 viewController.firstVC.testText = "サンプルテキスト" 7 navigationController?.pushViewController(viewController, animated: true) 8}

swift

1// XLPagerTabStripのベースとなるページ 2 3import UIKit 4import XLPagerTabStrip 5 6class SampleBaseView: ButtonBarPagerTabStripViewController { 7 8 var firstVC: Tab1! 9 var secondVC: Tab2! 10 var thirdVC: Tab3! 11 12 func setViewController() { 13 firstVC = storyboard?.instantiateViewController(withIdentifier: "FirstVC") as! Tab1 14 secondVC = storyboard?.instantiateViewController(withIdentifier: "SecondVC") as! Tab2 15 thirdVC = storyboard?.instantiateViewController(withIdentifier: "ThirdVC") as! Tab3 16 } 17 18 override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { 19 let childViewControllers: [UIViewController] = [firstVC, secondVC, thirdVC] 20 return childViewControllers 21 } 22 23}

swift

1// 表示するタブ1 2 3import UIKit 4import XLPagerTabStrip 5 6class Tab1: UIViewController { 7 8 var testText = "ここに渡したい" 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 print(testText) 14 } 15} 16 17extension Tab1: IndicatorInfoProvider { 18 func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { 19 return "タブ1" 20 } 21}

swift

1// 出力結果 2サンプルテキスト

上記のようにSampleBaseViewで、表示用のViewControllerを初期化するメソッドを分離して
遷移元から呼んであげることで、無事に値を渡すことが出来ました。

投稿2018/06/19 05:13

Y_M

総合スコア265

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

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

fuzzball

2018/06/19 05:14

回答書いてる最中に解決しないで下さいw
Y_M

2018/06/19 05:17

ふと思いついたのですw ただfuzzball様からの質問がなければ、たどり着けなかったと思います。 コメントの件に関しては本当に失礼しました。 以後気をつけるようにいたします。
guest

0

遷移元ってSampleBaseViewですよね?
普通にTab1のtestTextにアクセスすればよいのでは?
自分で生成しているのですから何の問題も無いと思いますが。

投稿2018/06/19 04:03

fuzzball

総合スコア16731

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

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

Y_M

2018/06/19 04:14

失礼しました。 遷移元は「SampleBaseView」ではないです。 「遷移元」→「SampleBaseView」→「SampleBaseViewの中でコンテナビュー?などで表示しているタブ」という構成になるのではないかと思います。
fuzzball

2018/06/19 04:16

遷移元からSampleBaseViewが見えているのなら同じことです。
Y_M

2018/06/19 04:23

let viewController = storyboard.instantiateViewController(withIdentifier: "Sample") as! SampleBaseView let detail = viewController.childViewControllers[0] as! Tab1 detail.testText = "sampleString" 上記のようにやってみましたが下記のエラーになりました。 「libc++abi.dylib: terminating with uncaught exception of type NSException」
fuzzball

2018/06/19 04:25

初心者じゃないんだから、もう少しマトモな書き方が出来ないですかね?
Y_M

2018/06/19 04:28

完全に独学でやってるものでして、記述が汚い(変)なのは本当に申し訳ないです。
fuzzball

2018/06/19 04:31 編集

コードの話じゃなくて、コメントの書き方ですよ。「初心者じゃない」というのは「teratailの初心者じゃない」という意味です。
Y_M

2018/06/19 04:32

大変失礼しました。 質問のところに追記で記載すればよかったですね。
fuzzball

2018/06/19 04:37

・エラーはどこで出ているのでしょうか? ・let detail = viewController.childViewControllers[0] as! Tab1 を実行すると、Tab1〜Tab3の新しいインスタンスが生成されて返ってきますが、それで問題ないでしょうか?
Y_M

2018/06/19 04:41

・エラーはどこで出ているのでしょうか? →実行した際に「let detail = viewController.childViewControllers[0] as! Tab1」  こちらの行でエラーとなっています。 ・Tab1〜Tab3の新しいインスタンスが生成されて返ってきますが、それで問題ないでしょうか? →新しいインスタンスが生成されると、「SampleBaseView」で遷移用に生成されているものと別になるのでこのやり方は問題かもしれません。
fuzzball

2018/06/19 04:51

すみません、見間違いがありました。 viewControllers ではなく childViewControllers ですね。 childViewControllers には Tab1〜Tab3が入っているでしょうか? もしかして、 let viewController = storyboard.instantiateViewController(withIdentifier: "Sample") as! SampleBaseView これも既に生成しているものとは別の SampleBaseView を生成しているのではないですか?
Y_M

2018/06/19 04:58

確認したところ、childViewControllers には何も入っていませんでした。 SampleBaseView の viewControllers でタブ用の画面を生成しているので、そこが走らないと空なのでしょう。 SampleBaseView に関しては遷移前の画面では、ここ"のみ"になっています。
fuzzball

2018/06/19 05:02

追記したコードはテストコード(サンプルコード)ではなく、実際にこの通りなんでしょうか?(三行並んでいる)
Y_M

2018/06/19 05:07

遷移元のコードは、遷移時の処理のみ抜粋しています。 ※他の部分は一般的なCollectionViewの表示部分のみ その他の2つに関しては、掲載している通りとなります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問