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

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

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

705閲覧

pushViewControllerで遷移しても画面の要素が表示されない

namenamenameko

総合スコア234

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

投稿2017/07/19 01:42

編集2017/07/19 01:53

Swift3,Xcode8.3.3でiOSアプリの開発をしています。
UINavigationControllerの使い方を勉強して、以下のように画面遷移を実装しました。

Swift

1... 2//画面遷移する関数 3internal func onTouchUpInside(_ sender: UIButton) { 4 let nextViewController = NextViewController() 5 self.navigationController?.pushViewController(nextViewController, animated: true) 6}

Swift

1//遷移先のUIViewController 2import UIKit 3import ChameleonFramework 4 5class NextViewController: UIViewController { 6 7 @IBOutlet weak var startButton: UIButton! 8 @IBOutlet weak var howToButton: UIButton! 9 10 override func viewDidLoad() { 11 self.navigationItem.title = "NEXT" 12 setUpButtons() 13 super.viewDidLoad() 14 } 15 internal func setUpButtons() { 16 self.startButton?.backgroundColor = HexColor(hexString: "#0B409C") 17 self.startButton?.titleLabel?.textColor = ContrastColorOf(backgroundColor: HexColor(hexString: "#0B409C"), returnFlat: true) 18 self.startButton?.titleLabel?.text = "スタート" 19 self.startButton?.layer.masksToBounds = true 20 self.startButton?.layer.cornerRadius = 20.0 21 self.startButton?.reversesTitleShadowWhenHighlighted = false 22 self.startButton?.addTarget(self, action: #selector(self.onTouchDownStart(_:)), for: .touchDown) 23 self.startButton?.addTarget(self, action: #selector(self.onTouchUpInsideStart(_:)), for: .touchUpInside) 24 self.s = self.startButton?.bounds 25 26 self.howToButton?.backgroundColor = HexColor(hexString: "#0B409C") 27 self.howToButton?.titleLabel?.textColor = ContrastColorOf(backgroundColor: HexColor(hexString: "#0B409C"), returnFlat: true) 28 self.howToButton?.titleLabel?.text = "遊びかた" 29 self.howToButton?.layer.masksToBounds = true 30 self.howToButton?.layer.cornerRadius = 20.0 31 self.howToButton?.reversesTitleShadowWhenHighlighted = false 32 self.howToButton?.addTarget(self, action: #selector(self.onTouchDownHowTo(_:)), for: .touchDown) 33 self.howToButton?.addTarget(self, action: #selector(self.onTouchUpInsideHowTo(_:)), for: .touchUpInside) 34 self.h = self.howToButton?.bounds 35 } 36}

このような感じです。
しかしながら、画面遷移はうまくいくのですがstartButton及びhowToButtonが画面に表示されません(真っ白)。ただし、タイトルのみは「NEXT」と切り替わってくれます。
ボタンはStoryboardで設置していますが、その他のボタンの設定やセグエの設定は行っておらず、このコードで表示できるものと思っていました。よってNext View ControllerをStoryboardの中に独立して置いている感じです。初心者のため何か間違っている点があれば教えて頂きたいです。もしこの内容で判断できかねる場合はお尋ねいただければ他の部分もお見せします。
ChameleonFrameworkに関しては、UIColorの設定を補助するライブラリなので関係かと思われます。

追記:
self.startButton?.layer.cornerRadius = 20.0などとボタンに対してnilガードをしているのは、していなかった場合にnilエラーでアプリが落ちてしまったためです。そしてこのようにnilガードするとボタンが表示されません。なので、startButton == null 及び howToButton == nullとなってしまっているのでしょうか、、

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

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

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

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

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

ykws

2017/07/19 03:21

setUpButtons をコメントアウトすると、どう表示されるように storyboard で設定しているのですか?
namenamenameko

2017/07/23 05:40

回答が遅れてしまいすみません、、Storyboardではとにかくデフォルトのボタンをドラッグ&ドロップして追加したのみです。それに対してコードでプロパティを設定すれば見た目を変えられると思っていました。しかしながらそもそもボタンがnilとなってしまっている理由がわかりませんでした、、
guest

回答2

0

ベストアンサー

swift

1let nextViewController = NextViewController()

これではStoryboardから生成していることにならないですよ。

例えば、NextViewControllerのStoryboard IDをNextViewControllerにした上で、

swift

1let nextViewController = UIStoryboard.instantiateViewController(withIdentifier: "NextViewController")

とすればStoryboardから生成できます。
(Storyboard IDをクラス名と同じにしましたが、何を付けてもかまいません)

投稿2017/07/19 04:47

編集2017/07/23 16:55
fuzzball

総合スコア16731

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

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

namenamenameko

2017/07/23 05:43

ありがとうございます。 UIStoryboardinstantiateViewControllerでググってもヒットしないのですが、、そういった関数があるのでしょうか?
namenamenameko

2017/07/23 05:54

let nextViewController = storyboard!.instantiateViewController(withIdentifier: "Next")と設定して、StoryBoardIDも"Next"を設定しましたが、同様にボタンが設定されません、、何が足りないのでしょうか。
namenamenameko

2017/07/23 06:14

segueを設定しなければ遷移できないのでしょうか?
namenamenameko

2017/07/23 06:54

すみません、let nextViewController = storyboard!.instantiateViewController(withIdentifier: "Next")で解決できていて、タブバーにボタンが隠れてしまっているだけでした。別の問題になってしまったため質問を立て直したいと思います。
fuzzball

2017/07/23 16:57

すでに解決しているようですが、ピリオドが抜けていたので回答を修正しておきました。
guest

0

もし UIButton のラベルを空で初期化しているなら、下記の書き方ではなく、

swift

1self.startButton?.titleLabel?.text = "スタート"

下記のようにボタンのラベルを設定すれば表示されると思います。

swift

1startButton.setTitle("スタート", for: .normal)

類似の質問:
How to Change textLabel property in UIButton programmatically in iOS?

投稿2017/07/19 03:24

ykws

総合スコア1236

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

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

namenamenameko

2017/07/23 05:49

ラベルを初期化するとはどういうことでしょうか。とにかくボタンに関して設定していることは質問内容のコードが全てで、加えてstoryboardでボタンの位置のみを設定しています。(他のプロパティは空)`@IBOutlet weak var startButton: UIButton!` のようにすることでstoryboardのボタンと結びついているのかと思いました。しかしstartButton自体がnilになってしまっているので、fuzzballさんのおっしゃるようにviewcontroller自体がstoryboardのものと結びついていない気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問