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

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

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

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

Swift

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

Q&A

0回答

645閲覧

iphoneアプリの画面遷移後の配置被りの原因と修正方法を教えてください。

Gameno

総合スコア10

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/12/10 08:43

編集2021/12/10 10:54

前提・実現したいこと

画面遷移後の瞬間的なバグを無くしたい。

発生している問題・エラーメッセージ

イメージ説明

画面遷移後、一瞬画面全体が上にきてしまい、navigation barと被ってしまいます。
シュミレーター、実機共の同じ挙動をします。

補足情報(FW/ツールのバージョンなど)

xocde13.1 swift使用 
・画面遷移はstoryboardで設定しています。
・navigation bar controllerとtab bar controllerをこの画面前に設定しています。
・この画面遷移時にrealmによるデータベース作成などが行われています。

よろしくお願いします。

storyboard
イメージ説明

青い画面のコード

Swift

1import UIKit 2import RealmSwift 3 4class ViewController: UIViewController { 5 6 var startCount: Int = 0 7 let userDefaults = UserDefaults.standard 8 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 startCount = userDefaults.integer(forKey: "startCount") 14 if startCount == 0 { 15 // 完全初期化 16 var config = Realm.Configuration() 17 config.deleteRealmIfMigrationNeeded = true 18 let realm = try! Realm(configuration: config) 19 try! realm.write { 20 realm.deleteAll() 21 } 22 23 //category.csvの読み込みとrealm化 24 guard let categoryPath = Bundle.main.path(forResource:"category", ofType:"csv") else { 25 print("categorycsvファイルがないよ") 26 return 27 } 28 29 do { 30 let csvStringData = try String(contentsOfFile: categoryPath, encoding: String.Encoding.utf8) 31 csvStringData.enumerateLines(invoking: {(line,stop) in 32 let categorySourceArray = line.components(separatedBy:",") 33 let category = Category() 34 category.id = Int(categorySourceArray[0])! 35 category.name = categorySourceArray[1] 36 37 try! realm.write { 38 realm.add(category) 39 } 40 }) 41 } catch _ { 42 print("categorycsv読み込みエラー") 43 return 44 } 45 46 //smallcategory.csvの読み込みとrealm化 47 guard let smallcategoryPath = Bundle.main.path(forResource:"smallcategory", ofType:"csv") else { 48 print("smallcategoryファイルがないよ") 49 return 50 } 51 52 do { 53 let csvStringData = try String(contentsOfFile: smallcategoryPath, encoding: String.Encoding.utf8) 54 csvStringData.enumerateLines(invoking: {(line,stop) in 55 let smallcategorySourceArray = line.components(separatedBy:",") 56 let smallcategory = SmallCategory() 57 smallcategory.category = realm.objects(Category.self).filter("id = (smallcategorySourceArray[0])").first 58 smallcategory.id = Int(smallcategorySourceArray[1])! 59 smallcategory.name = smallcategorySourceArray[2] 60 try! realm.write { 61 realm.add(smallcategory) 62 } 63 }) 64 } catch _ { 65 print("smallcategory読み込みエラー") 66 return 67 } 68 69 //question.csvの読み込みとrealm化 70 guard let path = Bundle.main.path(forResource:"question", ofType:"csv") else { 71 print("questioncsvファイルがないよ") 72 return 73 } 74 75 do { 76 let csvStringData = try String(contentsOfFile: path, encoding: String.Encoding.utf8) 77 csvStringData.enumerateLines(invoking: {(line,stop) in 78 let questionDataSourceArray = line.components(separatedBy:",") 79 let questionData = Question() 80 try! realm.write { 81 realm.add(questionData) 82 } 83 }) 84 } catch _ { 85 print("questioncsv読み込みエラー") 86 return 87 } 88 89 startCount = startCount + 1 90 userDefaults.set(startCount, forKey: "startCount") 91 } 92 } 93 override func viewWillAppear(_ animated: Bool) { 94 super.viewWillAppear(animated) 95 navigationController?.setNavigationBarHidden(true, animated: false) 96 loadView() 97 viewDidLoad() 98 99 100 } 101} 102

問題の画面遷移後のコード

swift

1import UIKit 2import RealmSwift 3 4 5class TableViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 6 7 @IBOutlet weak var tableView: UITableView! 8 @IBOutlet weak var topSegument: UISegmentedControl! 9 10 // 表示中のカテゴリデータ 11 var category: Category! 12 var questionCount : Int = 0 13 let realm = try! Realm() 14 var point : Int = 0 15 let userDefaults = UserDefaults.standard 16 var countButtonName: UIImage = UIImage(named: "growth0")! 17 var beforeID: Int = 0 18 var questionPoint: Int = 0 19 20 21 override func viewDidLoad() { 22 super .viewDidLoad() 23 userDefaults.register(defaults: ["point": 0]) 24 point = readData() 25 26 userDefaults.register(defaults: ["questionPoint": 10]) 27 questionPoint = readQuestionPointData() 28 print(questionPoint) 29 30 navigationController?.setNavigationBarHidden(false, animated: false) 31 32 // 初期表示するカテゴリ 33 self.category = realm.objects(Category.self).filter("name == '必要な資質'").first! 34 questionCount = category.questions.count 35 countImageName() 36 37 //navigationbarに設置するアイテム 38 self.tabBarController?.title = "5択問題" 39 let beforeButton = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action:#selector(beforeQuestion)) 40 let countButton = UIBarButtonItem(image: countButtonName.withRenderingMode(.alwaysOriginal), style: UIBarButtonItem.Style.plain, target: self, action:#selector (rewordComment)) 41 self.tabBarController?.navigationItem.rightBarButtonItems = [countButton, beforeButton] 42 beforeID = userDefaults.integer(forKey: "BeforeID") 43 44 } 45 46 47 override func viewWillAppear(_ animated: Bool) { 48 super.viewDidDisappear(animated) 49 topSegument.selectedSegmentIndex = 0 50 viewDidLoad() 51 tableView.reloadData() 52 navigationController?.setNavigationBarHidden(false, animated: false) 53 54 } 55 56

よろしくお願いします。

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

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

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

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

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

hoshi-takanori

2021/12/10 08:50 編集

ソースコードとか、storyboard のスクショとか、画面の構造が分かるようなものを提示してくれないと答えようがないと思います。
Gameno

2021/12/10 11:16

ソースコードとstoryboard のスクショを添付させていただきました。
hoshi-takanori

2021/12/10 19:42

Safe Area が効いてないか、setNavigationBarHidden が悪さをしてる気がしますが、再現しませんね…。 ちなみに、「画面遷移後、一瞬画面全体が上にきてしまい」ってのは、その後正しい表示になるってことですか? あと、viewWillAppear から loadView や viewDidLoad を呼ぶのは良くないというか、viewDidLoad と viewWillAppear が呼ばれるタイミングとその際にすべきことをちゃんと考えた方が良いと思います。
Gameno

2021/12/11 07:34

正確には、画面遷移中、スクショのような状態で表示されます。遷移が完全に完了するとほぼ同時に定位置(segumentやtable viewがあるべき場所)に戻ります。ちなみに、segumentの位置はsafe areaのtopとconstraintsされています。 viewWillAppearのご指摘ありがとうございます。あまり考えずに、動いたから大丈夫・・・とそのままにしていました。考えてみます。
hoshi-takanori

2021/12/11 10:34

よく見たら TableViewController の viewWillAppearで super.viewDidDisappear(animated) してますが、そのせいかも。 あと、question.csv の内容をわざわざ Realm に書き込む意味はあるのだろうか…。
Gameno

2021/12/12 10:22 編集

viewWillAppear内でsuper.viewDidDisappear(animated)を行なっていたため発生していました。 削除することで発生しなくなりました。 ちなみに、Realmはもともとデータ内での検索などに利用していたものの名残です。たしかに必要ないかも・・・。 いろいろとありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問