朧の.Netの足跡
問合せ先:support@oborodukiyo.info サイト内検索はこちら
Swift NavigationControllerを使っている時の画面遷移時のデータの受け渡し





UINavigation Controllerを追加した時にroot View Controllerも一緒についてきてびっくりしたと思います。
これは削除できます。
自分が追加したいUIViewControllerのShow the connection inspectorにおいて、Presenting Segues内のRelationshipの+からCtrlを押しながら矢印をUINavigationControllerまで伸ばすと、変更できます。
UINavigationControllerを使う時は、私はデータ数が多くなければUserDefaultsを利用するのがいいのではないかと思います。
そのままで保存できないデータを使っているのであれば、多く見かけるtopViewControllerに値を退避させて必要なところで読み込むのがいいと思います。
下記サンプルは、UserDefaultsを使う例です。
(参考)UserDefaultsの使い方
ViewControllerがroot View Controllerで、そこからNextViewControllerに画面遷移します。
NextViewControllerでテキストボックスにデータを入力して保存ボタンを押します。
この保存ボタンのアクションがsave(_:)メソッドです。
そこで渡したいデータをUserDefaultsに保存します。
ViewControllerに戻ったら、viewWillAppear(_:)メソッドで、UserDefaultsから読み込みます。
ここで注意が必要なのは、一番最初に起動した時は初めて表示されたときにもviewWillAppear(_:)メソッドが呼ばれ、その時にはUserDefaultsにデータが無いということです。
その場合は、nilの時なのでその場合の為にnilにも対応しておきましょう。


ViewController.swift

class ViewController: UIViewController {
    //データを表示するラベル
    @IBOutlet weak var lblDestination: UILabel!
    //アプリ固有のデータを保存できる記憶領域
    let ud = UserDefaults.standard
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    //このビューが表示される時に呼び出されるメソッド
    override func viewWillAppear(_ animated: Bool) {
        self.lblDestination.text = self.ud.string(forKey: "myData") ?? ""
    }
}
    

NextViewController.swift

class NextViewController: UIViewController {
    //受け渡すデータを入力するテキストボックス
    @IBOutlet weak var txtSource: UITextField!
    //アプリ固有のデータを保存できる記憶領域
    let ud = UserDefaults.standard
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    //保存ボタンを押した時に呼ばれるメソッド
    @IBAction func save(_ sender: Any) {
        accessUserDefaults(read: false)
    }
    
    //UserDefaultsにアクセスする時に呼び出すメソッド
    func accessUserDefaults(read: Bool) {
        if read {
            self.txtSource.text = self.ud.string(forKey: "myData") ?? ""
        } else {
            self.ud.set(self.txtSource.text, forKey: "myData")
        }
    }
}

    








良いやや良い普通やや悪い悪い

投稿日時評価コメント