🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

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

Swift

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

Q&A

解決済

1回答

1237閲覧

XLPagerTabStripで追加したViewControllerを削除するボタンを実装したい

tyu

総合スコア17

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/02/04 14:36

編集2021/02/04 23:35

【現在作成中のアプリの概要】

現在、タブ付きのTODOリストを作成しています。
タブの生成はライブラリのXLPagerTabStripを使用しています。

添付ファイル中のタブ1(book1)とタブ2(book2)は常に表示させており、
Viewの右上にある+ボタンを押すと新規のタブ(book3)が増える仕組みになっています。
タブの追加は下記に記載のMainViewControllerで管理しています。

【現在詰まっている箇所】

追加したタブを削除するボタンをViewの右上に設置。
このボタンを押すと追加したタブを削除できるようにしたいのですが、実装できません。
マイナスボタンは下記コードのremoveTab()と接続しています。
上記の実装を可能にする方法を知っている方がいらっしゃいましたら、ご教授の程よろしくお願い致します。

swift

1 2import UIKit 3import XLPagerTabStrip 4import RealmSwift 5 6class MainViewController: ButtonBarPagerTabStripViewController { 7 // 追加する ViewController 8 var newVC: UIViewController? 9 10 11 //なんかよく分からないから取りあえず消しとく 12// private var realm: Realm! 13 //Realmから受け取るデータを突っ込む変数を準備 14 private var tabList: Results<tabModel>! 15// var ison: Bool! 16 //Realmから受け取るデータを突っ込む変数を準備 17// private var ison: Results<isVC3>! 18 19 var number = 0 20 21 override func viewDidLoad() { 22 super.viewDidLoad() 23 // タブの背景色 24 settings.style.buttonBarBackgroundColor = UIColor.lightGray 25 // タブの色 26 settings.style.buttonBarItemBackgroundColor = UIColor.lightGray 27 // タブの文字サイズ 28 settings.style.buttonBarItemFont = UIFont.systemFont(ofSize: 15) 29 // カーソルの色 30 buttonBarView.selectedBar.backgroundColor = UIColor.darkGray 31 32 print(number,"現時点での値") 33 34 } 35 36 37 //タブ追加のメソッド 38 override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { 39 // 現時点で登録されている ViewController をコピー(viewControllers は get only) 40 var vcs = self.viewControllers 41 42 // まだ何も登録されていない場合 43 if vcs.isEmpty { 44 // 初期設定の ViewController を追加 45 let table1 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "notebook_table") as! ViewController 46 table1.noteBookName = "book1" 47// table1.view.backgroundColor = .red 48 vcs.append(table1) 49 50 //ThirdViewControllerをインスタンス化する 51 let table2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "notebook_table2") as! SecondViewController 52 table2.noteBookName = "book2" 53// table2.view.backgroundColor = .yellow 54 vcs.append(table2) 55 56 //以下のコードを入力すると、再起動後に最新の数字が表示される 57 let realm = try! Realm() 58 let obj = realm.objects(isVC3.self) 59 60 61 62 63 for objData in obj{ 64 65 print(objData.isOnVC,"realmに保存されている値") 66 number = objData.isOnVC 67 } 68 69 if number > 0 { 70 //SecondViewControllerをインスタンス化する 71 let table3 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "notebook_table3") as! ThirdViewController 72 table3.noteBookName = "book3" 73 vcs.append(table3) 74 } 75 76 } 77 78 // 追加する ViewController がある場合 79 if let addvc = newVC { 80 // 追加する 81 vcs.append(addvc) 82 83 // 追加に利用した newVC は nil に戻す 84 newVC = nil 85 } 86 87 return vcs 88 } 89 90 //タブを追加するボタン 91 @IBAction func addTab(_ sender: Any) { 92 let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "notebook_table3") as! ThirdViewController 93 vc.noteBookName = "book3" 94// vc.view.backgroundColor = .green 95 96 // newVC に追加したい ViewController を登録する 97 newVC = vc 98 99 let obj = isVC3() 100 print(obj.isOnVC,"追加前の値") 101 102 print(number,"追加中の値") 103 number += 1 104 105 obj.isOnVC = number 106 print(obj.isOnVC,"追加後の値") 107 108 109 let realm = try! Realm() 110 111 try! realm.write { 112 realm.add(obj) 113 //print(obj.numbers) 114 } 115 116 //タブを動的に追加するなど、表示を更新するメソッド(追加したタブを表示するメソッド) 117 reloadPagerTabStripView() 118 } 119 120 @IBAction func removeTab(_ sender: Any) { 121 let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "notebook_table3") as! ThirdViewController 122 vc.noteBookName = "book3" 123 vc.hidesBottomBarWhenPushed = true 124 125 let obj = isVC3() 126 127 number -= 1 128 129 obj.isOnVC = number 130 131 let realm = try! Realm() 132 133 try! realm.write { 134 realm.add(obj) 135 //print(obj.numbers) 136 } 137 //タブを動的に追加するなど、表示を更新するメソッド(追加したタブを表示するメソッド) 138 reloadPagerTabStripView() 139 } 140} 141 142

イメージ説明

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

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

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

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

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

hoshi-takanori

2021/02/04 17:52

removeTab では storyboard から新しいタブを読み込む必要はなく、newVc を nil にして reloadPagerTabStripView を呼べばいいと思いますが、そもそもの作りがいまいちな気が…。
guest

回答1

0

ベストアンサー

基本的には、self.vieControllers[] に現在表示している ViewController が入っているので、それから削除したい ViewController だけを削除すれば良いのですが、このプロパティは get only なので、少し工夫が必要です。

あくまでも一例ですが(これでも一応動きますが)

self.currentIndex には現在表示している viewController の Index が入っていますので、

Swift

1 var deleteVCindex: Int? 2 3 @IBAction func removeTab(_ sender: Any) { 4 deleteVCindex = swlf.currentIndex 5 6 reloadPagerTabStripView() 7 }

みたいな感じで削除したいインデックスを保存し、

Swift

1 override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { 2 // 現時点で登録されている ViewController をコピー(viewControllers は get only) 3 var vcs = self.viewControllers 4 5 // 中略 6 7 // 削除する ViewController がある場合 8 if let deleteVC = deleteVCindex { 9 vcs.remove(at: deleteVC) 10 deleteVCindex = nil 11 } 12 13 return vcs 14 }

みたいな感じでviewControllers(for:) の中で直接削除すれば、一応削除させることは可能です。

ただ、XLPagerTabStripはもう数年もメンテされていないですし、そもそもライブラリの機能としてダイナミックなタブの追加・削除はサポートしていない(使用者の責任で viewControllers の数を管理しなければならない)ため、もしかしたら現状でもメンテナンスされている上、動的な追加・削除が可能な別の OSS を探された方がよいかもしれません。

投稿2021/02/05 03:58

TsukubaDepot

総合スコア5086

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

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

tyu

2021/02/06 06:49

いつも助けて下さってありがとうございます。 確かにメンテされているライブラリに変更するのも一つの手ですね。 XLPagerTabStripの代わりになるライブラリも探してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問