前提・実現したいこと
画面遷移後の瞬間的なバグを無くしたい。
発生している問題・エラーメッセージ
画面遷移後、一瞬画面全体が上にきてしまい、navigation barと被ってしまいます。
シュミレーター、実機共の同じ挙動をします。
補足情報(FW/ツールのバージョンなど)
xocde13.1 swift使用
・画面遷移はstoryboardで設定しています。
・navigation bar controllerとtab bar controllerをこの画面前に設定しています。
・この画面遷移時にrealmによるデータベース作成などが行われています。
よろしくお願いします。
青い画面のコード
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
よろしくお願いします。
ソースコードとか、storyboard のスクショとか、画面の構造が分かるようなものを提示してくれないと答えようがないと思います。
ソースコードとstoryboard のスクショを添付させていただきました。
Safe Area が効いてないか、setNavigationBarHidden が悪さをしてる気がしますが、再現しませんね…。
ちなみに、「画面遷移後、一瞬画面全体が上にきてしまい」ってのは、その後正しい表示になるってことですか?
あと、viewWillAppear から loadView や viewDidLoad を呼ぶのは良くないというか、viewDidLoad と viewWillAppear が呼ばれるタイミングとその際にすべきことをちゃんと考えた方が良いと思います。
正確には、画面遷移中、スクショのような状態で表示されます。遷移が完全に完了するとほぼ同時に定位置(segumentやtable viewがあるべき場所)に戻ります。ちなみに、segumentの位置はsafe areaのtopとconstraintsされています。
viewWillAppearのご指摘ありがとうございます。あまり考えずに、動いたから大丈夫・・・とそのままにしていました。考えてみます。
よく見たら TableViewController の viewWillAppearで super.viewDidDisappear(animated) してますが、そのせいかも。
あと、question.csv の内容をわざわざ Realm に書き込む意味はあるのだろうか…。
viewWillAppear内でsuper.viewDidDisappear(animated)を行なっていたため発生していました。
削除することで発生しなくなりました。
ちなみに、Realmはもともとデータ内での検索などに利用していたものの名残です。たしかに必要ないかも・・・。
いろいろとありがとうございました。
あなたの回答
tips
プレビュー