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

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

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

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

1676閲覧

swiftのTabPageViewControllerのcurrent_indexを取得したい

kaji

総合スコア648

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/08/15 05:46

編集2016/08/15 06:27

swiftのTabPageViewControllerのcurrent_indexを取得したいです

TabPageViewController公式ページ
https://github.com/EndouMari/TabPageViewController

前回こちらで質問したこと
https://teratail.com/questions/44158
(swiftのTabPageViewControllerの上部タブの高さをTableView上下スクロール時に変更したい)

を皆さんのおかげで解決できたのですが、

上部タブの高さを小さくしたところ
tabItems内のViewContorollerのtableViewのAutoLayoutのtop部分も再調整する必要がでてきました。

そこで現在のTabのindex値を取得して現在表示しているViewControllerのAutolayoutを
調整したいので、できるかやってみたところ

最初のviewControllerのAutolayoutは以下のようなコードで変更できました。
(以下のtabItems[0]の部分が最初のviewController)

swift

1class CustomTabPageViewController: TabPageViewController { 2 func setMarginTop(margin: CGFloat) { 3 let vc: ListViewController = tabItems[0].viewController as! ListViewController 4 vc.setMarginTop(margin) 5 } 6 7class ListViewController: UIViewController ,UITableViewDataSource, UITableViewDelegate { 8 func setMarginTop(margin: CGFloat) { 9 // 自動レイアウトoff 10 self.imgTableView.translatesAutoresizingMaskIntoConstraints = false 11 self.view.removeConstraint(_view1MarginTop) 12 // 自動レイアウトtop 13 _view1MarginTop = NSLayoutConstraint( 14 item: imgTableView, 15 attribute: NSLayoutAttribute.Top, 16 relatedBy: NSLayoutRelation.Equal, 17 toItem: self.topLayoutGuide, 18 attribute: NSLayoutAttribute.Top, 19 multiplier: 1.0, 20 constant: margin) 21 self.view.addConstraint(_view1MarginTop) 22 } 23

あとは現在のindex値をtabItems[0]の0の部分にいれるだけなのですが、
index値がTabView.swiftのbeforeIndexに入っているっぽいのですがprivateで取得できずでした。

TabView.swiftは以下の通りです

swift

1internal class TabView: UIView { 2 3 var pageItemPressedBlock: ((index: Int, direction: UIPageViewControllerNavigationDirection) -> Void)? 4 var pageTabItems: [String] = [] { 5 didSet { 6 pageTabItemsCount = pageTabItems.count 7 beforeIndex = pageTabItems.count 8 } 9 } 10 11 private var isInfinity: Bool = false 12 private var option: TabPageOption = TabPageOption() 13 private var beforeIndex: Int = 0 14 private var currentIndex: Int = 0 15 private var pageTabItemsCount: Int = 0 16 private var shouldScrollToItem: Bool = false 17 private var pageTabItemsWidth: CGFloat = 0.0 18 private var collectionViewContentOffsetX: CGFloat = 0.0 19 private var currentBarViewWidth: CGFloat = 0.0 20 private var cellForSize: TabCollectionCell! 21 private var cachedCellSizes: [NSIndexPath: CGSize] = [:] 22 private var currentBarViewLeftConstraint: NSLayoutConstraint? 23

publicであれば以下で取得できるはずなのですが、privateなので取得できない感じです。

swift

1 if let tabView = view.subviews.last { 2 print(tabView.beforeIndex) 3 }

前回教えてもらった

swift

1view.subviews.last 2constraints.last

を駆使してどうにかできないかいろいろ試しましたが、
index値が他のviewに入ってなかったので取得できずでした。
どうにかindex値を取得できませんでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

TabPageViewController クラスにも currentIndex というプロパティがあるみたいですが、そちらを使ってみてはどうでしょうか?

追記:
あれ?githubのコード見るとprivateじゃないのにな…と思ったら過去のバージョンではprivateだったみたいですね。
TabPageViewControllerのバージョン0.1.1以前はprivateで、バージョン0.2.0以降ではprivateが外れています。
v0.1.1
v0.2.0

対応としては TabPageViewController のバージョンを上げるか、currentIndexと同じロジックを実装する(currentIndex内ではpublicのプロパティしか使っていないみたいなので)しかないんじゃないでしょうか。

投稿2016/08/15 09:38

編集2016/08/15 11:13
u39ueda

総合スコア950

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

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

kaji

2016/08/15 10:13

TabPageViewController側のcurrentIndexもprivateでした。 private var currentIndex: Int? swift歴が半月程度なのでswiftのprivateの認識が間違っているのかと思い 子クラスから取得できるか試してみましたが、やはり子クラスからは取得できず、 Value of type 'TabPageViewController' has no membar 'currentIndex'となってしまいました。 実行したコードはこちらです print("currentIndex=" + String(super.currentIndex))
u39ueda

2016/08/15 11:17

追記しました。 privateについてはその通りで子クラスからはアクセスできません。 でもswiftのprivateは自クラス以外にも同じソースファイルからならアクセスできます(ですがややこしいので基本的に自クラスしかアクセスできないと思って構わないと思います)
kaji

2016/08/15 12:11 編集

u39uedaさんのおかげで一歩先へ進めそうです 旧バージョンをみてたようです。失礼しました。 pod updateしてみました。 >Installing TabPageViewController 0.2.1 (was 0.1.1) これでアクセスできると思い、ビルドしてみましたが 同じエラーになってしまいました。 Value of type 'TabPageViewController' has no membar 'currentIndex' ライブラリをキャッシュしてるのかなと思い一度 TabPageViewControllerを削除し、もう一度pod installして TabPageViewControllerを入れて確認しましたが、やはり同じエラーになりました。 currentIndexのプロパティにpublicが付いてないからかな?と思い、 TabPageViewControllerを試しにunlockしcurrentIndexにpublicをつけて確認した ところうまく読み込めました。 ライブラリ(別モジュール)のプロパティにアクセスするには publicにする必要があるのですね。 今回はpublicについて勉強になりました。 もうどうしようもないので、 var currentIndex を public var currentIndex に変更して TabPageViewControllerをまるっと自プロジェクト内に実装しようかと思います。
u39ueda

2016/08/15 15:21

あああそうでしたすみません。 アクセス修飾子ないのは別モジュールからアクセスできないのでした。 そうなると普通の方法ではcurrentIndexはアクセスできないと思いますので丸々取り込む方法もありだと思います。 またはTabPageViewControllerのサブクラスを作ってcurrentIndexだけオーバーライドするとか…でしょうか。
kaji

2016/08/15 19:36 編集

ライブラリ改変せずにできるならそうしたいです。 overrideできるか以下のように試してみたのですが、エラーが発生しました。 その1 override public var currentIndex: Int? Declaring a public var for an internal class その2 override public var currentIndex: Int? { guard let viewController = viewControllers?.first else { return nil } return tabItems.map{ $0.viewController }.indexOf(viewController) } Declaring a public var for an internal class Property does no override any property from its superclass その2はtabItemsがprivateなのでどっちみちダメなのかもとも思ってます。 どうすればoverrideできますでしょうか?
fuzzball

2016/08/16 00:38 編集

overrideは付けず、var currentIndex: Int? { (中略) } をそのままコピーでいいはずです。
kaji

2016/08/16 15:10

var currentIndex: Int? { guard let viewController = viewControllers?.first else { return nil } return tabItems.map{ $0.viewController }.indexOf(viewController) } そのまま貼り付けで行けました! tabItemsがprivateなのでダメなのかと思いましたが、verupで publicになってたので行けるようになってました。 fuzzballさん、u39uedaさんのおかげで解決することができました。 ありがとうございます。
guest

0

現在のindexってcurrentIndexじゃないんでしょうか?

swift

1if let viewController = tc.viewControllers!.first { 2 let currentIndex = tc.tabItems.map{ $0.viewController }.indexOf(viewController) 3}

投稿2016/08/15 06:35

編集2016/08/15 23:50
fuzzball

総合スコア16731

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

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

kaji

2016/08/15 09:04

確認したところご指摘の通りfuzzballさんのいうとおり currentIndexが現在のindexでした。 改めて全コードを確認しましたがcurrentIndexはprivateで取得できませんでした collectionViewにindexを入れてましたが、 collectionViewもprivateで取得できませんでした。 collectionViewを.lastで取得できるところがあるか確認しましたが、 addしてるところもないようで、それも無理そうでした。
fuzzball

2016/08/15 23:53 編集

currentIndexがinternalなのに気付かず申し訳ないです。 currentIndexの中身をそのまま持ってくれば取得出来そうな感じですがどうでしょうか?(回答に追記)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問