「ゴルトン社長」のはじめの一歩

すげーブログ

世の中のすげーを伝える!

【iphoneアプリ開発_初心者必見】値渡しの基礎・基本

最終更新日:2020年08月14日
f:id:BlueThree:20200814204123j:plain:w500
家に引きこもっている「ゴルトン社長」です。(twitter : @GoRuton_1stStep)

人気の記事!

人生を変えたい人に向けて「はじめの一歩」を踏み出したい人にオススメ!

www.goruton.com www.goruton.com www.goruton.com www.goruton.com

値渡しの基礎・基本

コロナで中々外出できない中、家で作業することが増えている「ゴルトン社長」です。(https://twitter.com/GoRuton_1stStep)

あるViewControllerから別のViewControllerに,数字や文字列などを渡す方法を参考までに紹介します。

1) 値渡し

  • ②のテキストフィールドに文字列を入れてボタンを押すことで,①のラベルにその文字列が表示される
  • アプリを閉じても,文字列は保存される

f:id:BlueThree:20190619210340p:plain:w400:h400
①ViewController, ②ataiController

①ViewController.swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var buttona: UIButton!
    @IBOutlet weak var labell: UILabel!
    var receiveData: String? = " "
    override func viewDidLoad() {
        super.viewDidLoad()
        let ud = UserDefaults.standard //UserDefalutsクラス(アプリに値を保存したり,値を読み込んだりするときに使用するクラス)
        receiveData = ud.string(forKey: "HiScore") // 存在しない場合は空
        labell.text = receiveData

    }
}

②ataiController.swift

import UIKit
class ataiController: UIViewController{
    
    @IBOutlet weak var aaa: UITextField!
    var giveData: String = " "
    
    
    @IBAction func button(_ sender: Any) {
        self.performSegue(withIdentifier: "SegueA", sender: nil)

    }
    // 遷移先のViewControllerにデータを渡す関数
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SegueA" {
            giveData = aaa.text!
            let vc = segue.destination as! ViewController
            vc.receiveData = giveData
            let ud = UserDefaults.standard //UserDefalutsクラス(アプリに値を保存したり,値を読み込んだりするときに使用するクラス)
            ud.set(giveData, forKey: "HiScore") //setで保存する
        }
    }
}


f:id:BlueThree:20190619210901p:plain
Segueの設定

2)様々な受け渡し方法の紹介

  • 5パターン紹介
A)遷移先のビューコントローラのインスタンスを取得してプロパティにセット
- part1  
- part2  
- part3  

B)ローカルストレージを経由
C)遷移元のビューコントローラのインスタンスを取得
  • 説明用アプリのコードと設定方法

f:id:BlueThree:20190619225248p:plain:h400:w400
MainStoryBoard

ViewController.swift

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var textField:UITextField!
    
    // for back
    @IBAction func goBack(_ segue:UIStoryboardSegue) {}  //部品とは繋げない
    
    /* 1 ++++++++++++++ */
    @IBAction func byInstantiateViewController(_ sender:UIButton) {
        let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController
        let _ = next?.view // ** hack code **
        next?.textField1.text = textField.text
        self.present(next!,animated: true, completion: nil)
    }
    
    /* 2 ++++++++++++++ */
    @IBAction func byInstantiateViewController2(_ sender:UIButton) {
        let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController
        self.present(next!,animated: true, completion: { () in
            next?.textField2.text = self.textField.text
        })
    }
    
    /* 3 ++++++++++++++ */
    /// セグエによる遷移
    @IBAction func byPerformSegue(_ sender:UIButton) {
        performSegue(withIdentifier: "nextSegue", sender: nil)
    }
    
    /// セグエ実行前処理
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let next = segue.destination as? NextViewController
        let _ = next?.view
        next?.textField3.text = textField.text
    }
    
    /* 4 ++++++++++++++ */
    @IBAction func byUserDefaults(_ sender:UIButton) {
        UserDefaults.standard.register(defaults: ["textField4":textField.text ?? ""])
        UserDefaults.standard.set(textField.text,forKey:"textField4")
        UserDefaults.standard.synchronize()
        
        let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController
        self.present(next!,animated: true, completion: nil)
    }
    
    /* 5 ++++++++++++++ */
    @IBAction func byPropertyAccess(_ sender:UIButton) {
        let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController
        self.present(next!,animated: true, completion: nil)
    }
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.init(red: 230/255, green: 255/255, blue: 230/255, alpha: 90/100)//背景色の変更
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}

NextViewController.swift

import UIKit

class NextViewController: UIViewController {
    
    @IBOutlet weak var textField1:UITextField!
    @IBOutlet weak var textField2:UITextField!
    @IBOutlet weak var textField3:UITextField!
    @IBOutlet weak var textField4:UITextField!
    @IBOutlet weak var textField5:UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.cyan //背景色を空色に変更
    }
    
    override func viewWillAppear(_ animated: Bool) {
        /// ローカルストレージ(UserDefaults)から値を取得
        guard let obj = UserDefaults.standard.object(forKey: "textField4") else {
            return
        }
        textField4.text = obj as? String
        
        /// 遷移元ビューコントローラにアクセスして値をセット
        textField5.text = (presentingViewController as? ViewController)?.textField.text
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
}

f:id:BlueThree:20190708213108p:plain
withIdentifierの設定方法

f:id:BlueThree:20190708213144p:plain
withIdentifierの設定方法(Segue)

f:id:BlueThree:20190619225817p:plain:h400:w400
Controller同士の繋げ方(controlボタンを押しながらドラッグ&ドロップ)

f:id:BlueThree:20190619225912p:plain:w400:h400
戻るためのSegueの繋ぎ方(goBack関数)

説明文

A)遷移先のビューコントローラのインスタンスを取得してプロパティにセット
part1

ボタンを押した際に,instantiateViewController()にて遷移先ビューコントローラのインスタンスを取得してそのプロパティにアクセス。

let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController
    let _ = next?.view // ** hack code **
    next?.textField1.text = textField.text
    self.present(next!,animated: true, completion: nil)
  • let _ = next?.view はアウトレット変数(textField1)をインスタンスさせるためのハックコード

-ハックコード:

Swiftの `_` (アンダースコア) - Qiita

[Swift] アンダースコア (_) の使いどころ - SKIPBIT

part2

instantiateViewController()にて遷移先ビューコントローラのインスタンスを取得するとこまではpart1と同じ

let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController
    self.present(next!,animated: true, completion: { () in
       next?.textField2.text = self.textField.text
    })
  • present()のコールバックブロックにてプロパティをセット
  • ハックコードが不要
  • テキストフィールドがチラつく感じがイケテない
part3

ボタン押下時,セグエ実行前に遷移先インスタンスを取得する方法

performSegue(withIdentifier: "nextSegue", sender: nil)

 /// セグエ実行前処理
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let next = segue.destination as? NextViewController
        let _ = next?.view
        next?.textField3.text = textField.text
    }

  • performSegue()は内部にてprepare()をコールしますので,これをオーバーライド。
  • アウトレット変数対策のハックコードが必要

B)ローカルストレージを経由

ボタン押下時。ローカルストレージに保存して遷移先でロードする方法。

UserDefaults.standard.register(defaults: ["textField4":textField.text ?? ""])
    UserDefaults.standard.set(textField.text,forKey:"textField4")
    UserDefaults.standard.synchronize()

    let next = storyboard!.instantiateViewController(withIdentifier: "nextView") as? NextViewController
    self.present(next!,animated: true, completion: nil)

==========================================================
/// ローカルストレージ(UserDefaults)から値を取得
    guard let obj = UserDefaults.standard.object(forKey: "textField4") else {
        return
    }
    textField4.text = obj as? String


C)遷移元のビューコントローラのインスタンスを取得

遷移先から遷移元ビューコントローラのインスタンスにアクセスする方法。

/// 遷移元ビューコントローラにアクセスして値をセット
    textField5.text = (presentingViewController as? ViewController)?.textField.text
  • UIViewControllerのプロパティ、presentingViewControllerには遷移元ビューコントローラのインスタンスが格納されています.
  • 格納タイミングはビュースタック構築後なので、viewDidLoad()内でアクセスしてもnilなので注意

3)背景色の変更方法

①)RGBを255で指定
②)カラーを指定

override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.init(red: 230/255, green: 255/255, blue: 230/255, alpha: 90/100)//背景色の変更①
        // self.view.backgroundColor = UIColor.cyan //背景色の変更②
    }

参考リンク

最後に!!

f:id:BlueThree:20200805191056j:plain:w500

最後までご覧いただき、本当にありがとうございます!!

最近は、たくさんの読者さんから「コメント」や「メッセージ」が届くようになりました!!
皆さんと会話できて嬉しいですし、コメントで毎日励まされています。

ありがとうございます!

これからも、ゴルトン社長は「毎日」ブログを更新しています! www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com

皆さんから人気がある記事

www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com

まとめ記事

www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com