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

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回答

424閲覧

画面遷移とタイトルについて

退会済みユーザー

退会済みユーザー

総合スコア0

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/05/26 16:02

編集2018/05/26 17:16

やりたい事

topViewControllerのSTARTボタンをタップした時にViewControllerに遷移する。
また、遷移する際にalertを呼び出し、入力した内容が遷移先のnavigationItemのtitleに反映させたい。

困っている事
segueで結ばれているのにalertを呼びだす実装をすると画面遷移が出来なくった。
また、遷移先のtitleに反映されるようにコーディングをしてみたが合ってるかどうか分からない状態です。
この状態ではエラー自体がないので実行できるがstartボタンを押すと落ちてしまう。(signal sigbrt)

swift

1import UIKit 2 3class topViewController: ViewController { 4 5 @IBOutlet var titlelbl: UILabel? 6 7 //ここではViewControllerに飛ぶ遷移についてと遷移先のnavigationbarのtitleの変更について 8 @IBAction func StartButton(_ sender: Any) { 9 // テキストフィールド付きアラート表示 10 let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert) 11 // OKボタンの設定 12 let okAction = UIAlertAction(title: "OK", style: .default, handler: { 13 (action:UIAlertAction!) -> Void in 14 // OKを押した時入力されていたテキストを表示 15 if let textFields = alert.textFields { 16 // アラートに含まれるすべてのテキストフィールドを調べる 17 for textField in textFields { 18 print(textField.text!) 19 let name = textField.text! 20 //self.ViewController.title(name) 21 self.navigationItem.title = name 22 23 } 24 } 25 }) 26 alert.addAction(okAction) 27 // キャンセルボタンの設定 28 let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) 29 alert.addAction(cancelAction) 30 // テキストフィールドを追加 31 alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 32 textField.placeholder = "テキスト" 33 }) 34 // 複数追加したいならその数だけ書く 35 // alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in 36 // textField.placeholder = "テキスト" 37 // }) 38 alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生 39 // アラートを画面に表示 40 self.present(alert, animated: true, completion: nil) 41 42 //画面遷移(ViewControllerに飛ぶ) 43 let next = storyboard!.instantiateViewController(withIdentifier: "ViewController") 44 self.present(next,animated: true, completion: nil) 45 } 46 47 48 @IBAction func HitoryButton(_ sender: Any) { 49 } 50 51 52 override func viewDidAppear(_ animated: Bool) { 53 super.viewDidAppear(animated) 54 55 // ナビゲーションを透明にする処理 56 self.navigationController!.navigationBar.setBackgroundImage(UIImage(), for: .default) 57 self.navigationController!.navigationBar.shadowImage = UIImage() 58 } 59}

自己解決出来た所

以下のように遷移をするのを遅らせる事により入力完了後に遷移する事が出来た

//遅延に関するコード DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.performSegue(withIdentifier: "ViewController", sender: nil) }

現在困っている事
アラートで入力した内容が意図したtitleに表示にされずに遷移先のnavigationitemに反映されてしまう。
やりたい事しては、navigationのtitleとして入力したものを反映させたいです。

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

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

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

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

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

guest

回答2

0

追記)
綺麗に見せるアニメーションに関して
https://teratail.com/questions/51583
に記載がありましたので、そちらも参考にするといいかもしれません。

投稿2018/05/26 16:30

hameji

総合スコア1380

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

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

退会済みユーザー

退会済みユーザー

2018/05/26 17:10

ありがとございます。画面遷移に関しては意図していた通りになりました。
guest

0

ベストアンサー

プロではありませんが、答えさせていただきます。

目的のことを行うには、ページ遷移をstoryboardだけで行う
(UIButtonから次のViewにControlで線を引く)のではなく、
コードで行わないといけない部分が出てきます。

①まず、storyboardでViewの上にあるバー(titleが表示されてる)
をクリックし、アイコン3つが表示する状態にして、
一番左の黄色の四角(ViewController)から次のViewにcontrolを押しながら
線を繋ぎます。

②その繋いだ線を選び、MacのMenu barView->Utilities->Show Attributes Inspectorを選ぶ

③Identifierに名前をつける、Kindにその遷移の種類を決める

④選ぶUIAlertActionのhandlerの中にperformsegueを打ち込む
正確にはhandlerの部分を

swift

1handler: { 2 (action: UIAlertAction!) -> Void in 3 performSegue(withIdentifier: "つけた名前", sender: nil) 4 5 })

と変更したらできるはずです。

助けになれば幸いです。

すっかりデータの受け渡しに関しても質問があったのを忘れてました。
prepare(for segue: sender:)を実装すれば解決します。

Swift(遷移前のSwiftファイル)

1 // MARK: -- Segue 2 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 3 if segue.identifier == "つけた名前" { 4 let nextView: 次のViewController= segue.destination as! 次のViewController5 nextView.titleName = self.つけた変数名 6 } 7 }

遷移後のswiftファイルに上で渡す先の変数を作っておく必要があります。

Swift(遷移後のSwiftファイル)

1var titleName = "" //をclass直下の行に記載 2 3override func viewDidLoad() { 4 self.title = self.titleName 5 6}

でいかがでしょうか?NavigationBarのtitleなら
これで表示されるはずです。

投稿2018/05/26 16:16

編集2018/05/26 17:29
hameji

総合スコア1380

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問