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

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

ただいまの
回答率

90.33%

  • Swift

    7712questions

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

swift 初回起動時のみ表示したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 317

EricaChloe

score 2

 前提・実現したいこと

初回起動時のみ表示したいviewがあります。
初回かどうかの判断はできているのですが、表示しようとするとエラーが出ます。
初回起動時以外はエラーもなく表示できています。

debugエリアで以下のエラーがでています。

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

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<sampleCoreBluetooth.ViewController 0x7fcd925098c0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key ownNumber.'

 該当のソースコード

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        let ud = UserDefaults.standard
        let dict = ["firstLaunch": true]
        ud.register(defaults: dict)

        if ud.bool(forKey: "firstLaunch"){
            ud.set(false, forKey: "firstLaunch")
            print("初回起動")

            let viewControllers = ViewController(nibName: "StartViewController", bundle: nil)
            window = UIWindow(frame: UIScreen.main.bounds)
            window?.rootViewController = viewControllers
            window?.makeKeyAndVisible()           
        }
        print("初回起動ではない")

        //tabbar 配列
        var viewControllers: [UIViewController] = []

        //1ページ目
        let firstTab = AttendanceView()
        firstTab.tabBarItem = UITabBarItem(title: "attend", image: UIImage(named: "dash"), tag: 1)
        viewControllers.append(firstTab)

        //2ページ目
        let secondTab = ChangeAttend()
        secondTab.tabBarItem = UITabBarItem(title: "status", image: UIImage(named: "pin"), tag: 2)
        viewControllers.append(secondTab)

        //セット
        let tabBarController = UITabBarController()
        tabBarController.setViewControllers(viewControllers, animated: false)

        let colorKey = UIColor(red: 249/155, green: 161/255, blue: 188/255, alpha: 1.0)
        UITabBar.appearance().tintColor = colorKey

        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = tabBarController
        window?.makeKeyAndVisible()

        return true
    }

 試したこと

初回起動時に表示したいviewにownNumberでtextFieldを置いてます。
@IBOutletも作り直し、名前をかえても同じエラーが表示されます。。

 解決方法

初回のみ登録してほしい番号があったので、それをuserDefaultsに登録。

    override func viewDidAppear(_ animated: Bool) {
        if ud.object(forKey: "Number") == nil {
            print("ud ない")
            let vc = StartViewController()
            self.present(vc, animated: true, completion: nil)

        } else {
            print("ud ある")
        }
    }

これで、初回起動&userDefaultsに値がない場合StartViewControllerに飛んでくれました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

コード眺めただけですが、
初回起動時はUIWindowを二回作っていませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/29 11:12

    コメントありがとうございます!
    初回起動と、それ以外で二つ用意しているのですが 一つでいいのでしょうか?

    キャンセル

  • 2018/07/29 11:34

    UIWindowは(普通は)起動時に一回しか作成しません。
    初回起動時に「初回起動」と「初回起動ではない」の両方が
    デバッグログに出ていませんか?
    初回起動時にStartViewControllerをwindowに渡したらそれでreturnして、
    StartViewControllerから本来の画面に遷移する手順を考えるか、
    あるいは(タブの一つ目でおそらく最初に表示される)AttendanceViewのviewWillAppearあたりで初回チェックして、初回ならそこで
    StartViewControllerをモーダルで出すとか。

    キャンセル

  • 2018/07/31 17:26

    AttendaceViewのviewDidAppearで判断させ、モーダルでStartViewControllerを出すことができました! ありがとうございます。

    キャンセル

0

this class is not key value coding-compliant for the key ownNumber
このエラーに関してはxibやstoryboard上のパーツ接続がよろしくない状況になっているときのエラーのようです。
(@IBOutletの名前を変更したのにつなぎ直していないなど)
なので一度、xibやstoryboardでパーツとの接続を解除してつなぎ直すと解消すると思います。
(ownNumberってのが未対応になっているようです)

swift初心者:「this class is not key value coding-compliant for the key」の対処方法
this class is not key value coding-compliant for the keyAdd Starlavandin

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/29 11:11

    コメントありがとうございます!
    全てつなぎなおしたり、作り直したりしたのですが同じエラーがでています。。

    キャンセル

  • 2018/07/29 12:22 編集

    ちなみにですが、エラー内容的には初回起動時にViewを切り替える処理は関係なさそうなのですが、そこの切り替えをなくして元の状態にするとエラーが発生しなくなりますか?エラー内容的にはStartViewControllerにあるownNumberが怪しそうです。例えばownNumberの部品を消した状態だとエラーがでなくなるようになる。それでもエラーが出るようであればまっさらの状態のStartViewControllerだけを配置する状態にする。などエラーが出ない状態から段階を踏んでいくとどの時点でエラーが発生するようになったかを確認できます。

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Swift

    7712questions

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