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

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

詳細はこちら
Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

1回答

713閲覧

UITabbarのアイコン設定について

Austin

総合スコア1

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2021/02/07 14:56

XcodeでUITabbarを利用して画面遷移を行いたいと思っています。その際にTabbarのアイコンを自前の画像に設定したいと思って調べてコードを書いてみました。しかし、下記に示したところで「fatal error: unexpectedly found nil while unwrapping an Optional value」というエラーが出ます。色々調べてみたのですが解決方法がわからず質問します。答えていただけるとありがたいです。
コードを貼ります。

import

1import UIKit 2 3class MainTabBarController: UITabBarController { 4 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 } 9 override func viewWillAppear(_ animated: Bool) { 10 super.viewWillAppear(animated) 11 12self.setTabBarItem(index: 0, titile: "リスト", image: UIImage(named:    "list-off")!, selectedImage: UIImage(named: "list-on")!, offColor:    UIColor.blue, onColor: UIColor.red) 13self.setTabBarItem(index: 1, titile: "追加", image: UIImage(named: "group-off")!, selectedImage: UIImage(named: "group-on")!, offColor: UIColor.gray, onColor: UIColor.black) 14 15UITabBarItem.appearance().setTitleTextAttributes([.font : UIFont.systemFont(ofSize: 11)], for: .normal) 16UITabBarItem.appearance().setTitleTextAttributes([.font : UIFont.systemFont(ofSize: 11)], for: .selected) 17 } 18 19 func setTabBarItem(index: Int, titile: String, image: UIImage, selectedImage: UIImage, offColor: UIColor, onColor: UIColor) -> Void { 20 let tabBarItem = self.tabBarController?.tabBar.items![index] 21ここからエラーが出ます!!!tabBarItem!.title = titile 22 tabBarItem!.image = image.withRenderingMode(.alwaysOriginal) 23 tabBarItem!.selectedImage = selectedImage.withRenderingMode(.alwaysOriginal) 24 tabBarItem!.setTitleTextAttributes([ .foregroundColor : offColor], for: .normal) 25 tabBarItem!.setTitleTextAttributes([ .foregroundColor : onColor], for: .selected) 26 } 27 28} 29コード

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

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

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

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

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

guest

回答1

0

self.tabBarController?.tabBar.items![index] とすると、MainTabBarController を管理している(親となっている)UITabBarController のプロパティを見てしまいます。

そうではなく、今回ように自身が UITabBarController のサブクラスであるならば、UITabBarController のプロパティである tabBar.index を直接見ればその時点で設定されているインデックスの数を把握することが可能です。

また、tabBarItem というプロパティは UITabBarController ですでに宣言されているので、混乱を避けるためにも別のプロパティ名を使った方がいいかと思います。

拝見したコードだと、強制アンラップを行なった上、インデックス(要素数)の確認も行なっていないため、より安全にするにはたとえば下記の様なコードになるかと思います。

Swift

1 func setTabBarItem(index: Int, titile: String, image: UIImage, selectedImage: UIImage, offColor: UIColor, onColor: UIColor) -> Void { 2 // オプショナルの判定を行い、さらに index が要素数以内であることを確認する 3 if let items = self.tabBar.items, index < items.count { 4 // tabBarItem は UTTabBarController ですでに宣言されている 5 let tabItem = items[index] 6 tabItem.title = titile 7 tabItem.image = image.withRenderingMode(.alwaysOriginal) 8 tabItem.selectedImage = selectedImage.withRenderingMode(.alwaysOriginal) 9 tabItem.setTitleTextAttributes([ .foregroundColor : offColor], for: .normal) 10 tabItem.setTitleTextAttributes([ .foregroundColor : onColor], for: .selected) 11 } 12 }

投稿2021/02/08 02:16

TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問