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

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

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

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

Q&A

解決済

1回答

672閲覧

遷移後にボタンが表示されない

coco7777

総合スコア8

Swift

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

0グッド

0クリップ

投稿2022/06/08 02:17

swift初学者です。
2画面間での遷移がうまくできせん。
画像に示した、③⇄④番での遷移の行き来を行いたいのですが、②の「編集」を押すと、③の画面に遷移するところまではいいのですが、③の「完了」を押すと遷移し④のように「編集」ボタンが非表示になり押せなくなります。
わかりにくい説明で申し訳ありませんが解決策を教えていただけると嬉しいです。
よろしくおねがいします。

イメージ説明

swift

1 2//画像②、④のコード 3 4import UIKit 5 6//import DKImagePickerController 7 8class textViewController: UIViewController,UINavigationControllerDelegate { 9 10 11 var hennsyuButtonItem:UIBarButtonItem! 12 13 14 15 @IBOutlet weak var imageScrollView: UIScrollView! 16 @IBOutlet weak var nameLabel: UITextField! 17 @IBOutlet weak var addressLabel: UITextField! 18 @IBOutlet weak var dateLabel: UITextField! 19 @IBOutlet weak var hyoukaLabel: UITextField! 20 @IBOutlet weak var textView: UITextView! 21 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 26 let appearance = UINavigationBarAppearance() 27 appearance.configureWithOpaqueBackground() 28 appearance.backgroundColor = .rgb(red: 173, green: 216, blue: 230) 29 navigationController?.navigationBar.tintColor = UIColor.white 30 //標準の高さ 31 navigationItem.standardAppearance = appearance 32 //ナビゲーションバーが透過する 33 navigationItem.scrollEdgeAppearance = appearance 34 //標準の文字の大きさ 35 navigationItem.compactAppearance = appearance 36 37 38 39 hennsyuButtonItem = UIBarButtonItem(title: "編集", style: .done, target: self, action: #selector(hennsyuButtonTapped(_:))) 40 self.navigationItem.rightBarButtonItem = hennsyuButtonItem 41 42 43 } 44// override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?){ 45// 46// self.view.endEditing(true) 47// } 48 49 50 //編集ボタンを押したとき 51 @objc func hennsyuButtonTapped(_ sender: UIBarButtonItem){ 52 53 let storyboard : UIStoryboard = self.storyboard! 54 let hennsyuVC = storyboard.instantiateViewController(withIdentifier:"hennsyuViewController") as! hennsyuViewController 55 navigationController?.pushViewController(hennsyuVC, animated: true) 56 57 //self.present(hennsyuVC, animated: true, completion: nil) 58 } 59 60 61 62// let pickerController = DKImagePickerController() 63// // 選択可能な枚数を20にする 64// pickerController.maxSelectableCount = 5 65// pickerController.didSelectAssets = { [unowned self] (assets: [DKAsset]) in 66// 67// // 選択された画像はassetsに入れて返却されるのでfetchして取り出す 68// for asset in assets { 69// asset.fetchFullScreenImage(completeBlock: { (image, info) in 70// // ここで取り出せる 71// self.imageView.image = image 72// }) 73// 74// } 75// 76// 77// } 78// 79// self.present(pickerController, animated: true) {} 80// 81 82 83} 84

swift

1 2//画像③のコード 3 4import UIKit 5//import DKImagePickerController 6 7class hennsyuViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate { 8 9 var completButtonItem:UIBarButtonItem! 10 11 12 @IBOutlet weak var textField: UITextView! 13 14 var checkpermission = CheckPermission() 15 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 20 let appearance = UINavigationBarAppearance() 21 appearance.configureWithOpaqueBackground() 22 appearance.backgroundColor = .rgb(red: 173, green: 216, blue: 230) 23 navigationController?.navigationBar.tintColor = UIColor.white 24 //標準の高さ 25 navigationItem.standardAppearance = appearance 26 //ナビゲーションバーが透過する 27 navigationItem.scrollEdgeAppearance = appearance 28 //標準の文字の大きさ 29 navigationItem.compactAppearance = appearance 30 31 checkpermission.checkCamera() 32 33 completButtonItem = UIBarButtonItem(title: "完了", style: .done, target: self, action: #selector(completButtonTapped(_:))) 34 35 self.navigationItem.rightBarButtonItem = completButtonItem 36 } 37 38 @IBAction func addImageButton(_ sender: Any) { 39 40 //アルバムを呼ぶ 41 let sourceType:UIImagePickerController.SourceType = .photoLibrary 42 createImagePicker(sourceType:sourceType) 43 44 } 45 46 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?){ 47 48 self.view.endEditing(true) 49 } 50 51 func createImagePicker(sourceType:UIImagePickerController.SourceType){ 52 53 let cameraPicker = UIImagePickerController() 54 cameraPicker.sourceType = sourceType 55 cameraPicker.delegate = self 56 cameraPicker.allowsEditing = true 57 58 self.present(cameraPicker, animated: true, completion: nil) 59 60 } 61 62 //完了ボタンを押した時 63 @objc func completButtonTapped(_ sender: UIBarButtonItem){ 64 65 let storyboard : UIStoryboard = self.storyboard! 66 let textVC = storyboard.instantiateViewController(withIdentifier:"textViewController") as! textViewController 67 68 self.present(textVC, animated: true, completion: nil) 69 70 } 71 72 //+ボタンから飛んできたのきた時はBackボタン(ナビゲーション)押せるように→押したらcell消す 73 74}

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

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

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

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

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

guest

回答1

0

ベストアンサー

ナビゲーションコントローラーの中で遷移してきていますので、
完了ボタンをタップした際にもナビゲーションコントローラーの中で遷移しないといけないのかなと思いました。
次のリンクなど参考になりますでしょうか。

1つ前の画面に戻る(popViewController)
https://capibara1969.com/203/#toc4

https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621886-popviewcontroller


********** 追記です。 **********

①の「+」ボタンを押すことで、③の画面に遷移し、「完了」ボタンを押すと④に遷移したいのですが、

見た目の動きがちょっとどうかな?と思いますが、次のような感じはどうでしょうか。
(①が一瞬表示される感じになってしまうようでした・・)

swift

1import UIKit 2 3class AppState { 4 static var isEdited = false // ③から完了をタップして戻ってきたことを表すフラグです。 5} 6// ①のビューコントローラー 7class ViewController1: UITableViewController { 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 let item = UIBarButtonItem(title: "+", style: .plain, target: self, action: #selector(action)) 11 navigationItem.rightBarButtonItem = item 12 } 13 @objc func action() { 14 let vc = storyboard?.instantiateViewController(withIdentifier: "view3") as! ViewController3 15 navigationController?.pushViewController(vc, animated: true) 16 } 17 override func viewWillAppear(_ animated: Bool) { 18 // TODO: ①に戻ってきたらUITableViewを再描画します。 19 if AppState.isEdited { 20 // ③から完了をタップして戻ってきた場合は②に遷移します。 21 AppState.isEdited = false 22 let vc = storyboard?.instantiateViewController(withIdentifier: "view2") as! ViewController2 23 navigationController?.pushViewController(vc, animated: true) 24 } 25 } 26 override func numberOfSections(in tableView: UITableView) -> Int { 27 return 1 28 } 29 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 30 return 1 31 } 32 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 33 let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) 34 return cell 35 } 36 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 37 tableView.deselectRow(at: indexPath, animated: true) 38 let vc = storyboard?.instantiateViewController(withIdentifier: "view2") as! ViewController2 39 navigationController?.pushViewController(vc, animated: true) 40 } 41} 42 43// ②のビューコントローラー 44class ViewController2: UIViewController { 45 override func viewDidLoad() { 46 super.viewDidLoad() 47 let item = UIBarButtonItem(title: "編集", style: .plain, target: self, action: #selector(action)) 48 navigationItem.rightBarButtonItem = item 49 } 50 @objc func action() { 51 let vc = storyboard?.instantiateViewController(withIdentifier: "view3") as! ViewController3 52 navigationController?.pushViewController(vc, animated: true) 53 } 54} 55 56// ③のビューコントローラー 57class ViewController3: UIViewController { 58 override func viewDidLoad() { 59 super.viewDidLoad() 60 let item = UIBarButtonItem(title: "完了", style: .plain, target: self, action: #selector(action)) 61 navigationItem.rightBarButtonItem = item 62 } 63 @objc func action() { 64 if let n = navigationController, 65 n.viewControllers[n.viewControllers.count - 2] is ViewController1 { 66 // ①から遷移してきた場合は完了をタップしたことを表すフラグを設定します。 67 AppState.isEdited = true 68 } 69 navigationController?.popViewController(animated: true) 70 } 71}

投稿2022/06/08 03:29

編集2022/06/09 14:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

coco7777

2022/06/08 23:42

xg63ex2bさん、またまたありがとうございます!! 参考にさせていただいたところ、解決しました! もっとよく調べてから質問した方がよかったと反省しております、、、 また回答をお願いすると思いますので、その際はよろしくお願いします
coco7777

2022/06/08 23:52

たびたび申し訳ありません ③⇄④の遷移はうまくいくようになったのですが、①の「+」ボタンを押すことで、③の画面に遷移し、「完了」ボタンを押すと④に遷移したいのですが、今のままであると「完了」ボタンを押すと、①番に戻ってしまいます この場合はどうすればよいでしょうか?
退会済みユーザー

退会済みユーザー

2022/06/09 00:57

コメントありがとうございます。 > また回答をお願いすると思いますので、その際はよろしくお願いします 私も完成が楽しみですので、よろしくお願いします。 > ①の「+」ボタンを押すことで、③の画面に遷移し、「完了」ボタンを押すと④に遷移したいのですが、 ①から②の遷移はセルをタップして、詳細を表示するという感じですよね。 「+」をタップすると(別のビューで内容を入力して)、①のビューにセルが追加される感じですよね。 あまり凝ったことをしたことがないもので、 確認してもいなくて、できるかどうかわからないですが、 考え方として、 UINavigationControllerは階層を意識するものですので、 「+」をタップして③から④(②?)に直接遷移すると ②の「Back」のタップの制御などでまた苦労しそうに思いました。 ですので、内部的には 「+」をタップして、③で「完了」をタップしたら③から①に戻って 自動的に②に遷移するような仕組みになりそうに思いました。 ①のビューコントローラーにおいて、 ③の「完了」をタップして戻ってきたのか判断できるのかな? そしてその場合に自動で②に遷移することができるのかな? 調べて確認するのにもうしばらく時間が必要そうです。 もうちょっとお待ちください。 先にご自身で解決できてしまうようでしたらまたコメントください。
coco7777

2022/06/09 12:17

回答ありがとうございます! > 私も完成が楽しみですので、よろしくお願いします。 xg63ex2bさんは聡明な上に、人格者でもあるのですね 他人である自分に協力してくださるだけでなく、こんな言葉まで、、、すごく嬉しいです、ありがとうございます 頑張ります! >UINavigationControllerは階層を意識するものですので、 「+」をタップして③から④(②?)に直接遷移すると ②の「Back」のタップの制御などでまた苦労しそうに思いました。 そうですよね、実際ボタンをつけてやってみようとしたのですが、①の画面にも「戻る」ボタンが表示されて全然うまくできませんでした >内部的には 「+」をタップして、③で「完了」をタップしたら③から①に戻って 自動的に②に遷移するような仕組みになりそうに思いました。 そうですね、それが1番良さそうです 自分でも調べてみます
退会済みユーザー

退会済みユーザー

2022/06/09 14:15 編集

コメントありがとうございます。 こちらこそ嬉しいお言葉ありがとうございます。 (実際の私はすごく未熟です・・) 6/9の15:35に回答欄の下の方(コメントではなく)にコードを追記しました。 最小限で確認したものですので、質問欄のコードとは違うのですが、 コードの中のコメント部分を見てみてください。
coco7777

2022/06/10 10:00

コメントありがとうございます! 追記の方、拝読しました 教えていただいたものをもとにコードを書いてみると、うまく動作しました! 毎回ありがとうございます、頭が上がりません 恐縮なのですが少し質問させてください if let n = navigationController, n.viewControllers[n.viewControllers.count - 2] is nikkiTableViewController の部分がどういった意味なのでしょうか? 抽象的な質問で申し訳ありません 回答をいただけると嬉しいです
退会済みユーザー

退会済みユーザー

2022/06/10 10:25

コメントありがとうございます。 > 恐縮なのですが少し質問させてください 大丈夫です、少しでも不明な点がありましたらコメントください。 (あまり説明が上手くないものですから・・) > if let n = navigationController, > n.viewControllers[n.viewControllers.count - 2] is nikkiTableViewController > の部分がどういった意味なのでしょうか? `if let n ...`の行は「Optional Binding」になります。 nilの可能性があるOptionalを安全にアンランップするためのものになります。 Optional Binding https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html#ID333 `n.viewControllers[n.viewControllers.count - 2] is nikkiTableViewController ` の行は、ナビゲーションコントローラーに保持されているスタック(スタックで伝わりますでしょうか?)から ひとつ前のビューコントローラーが①かどうかを判断しています。 多くのプログラミング言語ではインデックスは0から始まるので、配列のカウント-1がインデックスの最大になるのですが、 (このロジックを記述しているタイミングでは)現在表示されているビューコントローラー③が配列カウント-1のインデックスに存在しますので、 そのひとつ前ということで、配列のカウント-2のインデックスが①かどうかを判断しています。 https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621873-viewcontrollers スタックの参考です。 (スタックは、深い階層に行くとカウントが増えて、浅い階層に行くとカウントが減るようなイメージです) https://ja.wikipedia.org/wiki/スタック
coco7777

2022/06/13 08:55

送信できていませんでした↓↓ 解説ありがとうございます! 「スタック」というのですね、用語の勉強にもなりました n.viewControllers[n.viewControllers.count - 2] と nikkiTableViewController が一致してる つまり、1つ前のViewControllerは① であるから、「AppState.isEdited = true」が呼ばれるということですね しかし、②の「編集」ボタン→③の画面にいった時は n.viewControllers[n.viewControllers.count - 2] が textViewController「②の画面」 になり一致しないので navigationController?.popViewController(animated: true) が呼ばれるという認識で間違いないでしょうか?
退会済みユーザー

退会済みユーザー

2022/06/13 09:02

コメントありがとうございます。 *回答に対するコメントを回答者が入力すると質問者にメールが届かないかもしれませんがコメントしてみます > という認識で間違いないでしょうか? その認識で大丈夫だと思います。 ①から遷移してきた時だけ「AppState.isEdited = true」したいためのロジックになります。
coco7777

2022/06/19 05:13

たびたびありがとうございました!! 今回も学びの多い回答たくさんしていただきありがたい限りです またおねがいします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問