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

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

ただいまの
回答率

91.03%

  • Swift

    6068questions

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

swiftで画面遷移後、値が更新されない

受付中

回答 1

投稿

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

arama

score 3

swiftでの画面遷移で値が更新されていない状態で渡されてしまっています。
具体的に言うと、MemberViewcontrollerのString型のname1,2,3,4をViewcontrollerに引き継ぎたいのですが、引き継ぐ前に元々代入していたarama1,2,3,4が使われており、NSuserDefaultに保存していたものが代入できていません。
どうすれば良いでしょうか。

送られた先の画面のソースです
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var name1: UILabel! = UILabel()
    @IBOutlet weak var name2: UILabel! = UILabel()
    @IBOutlet weak var name3: UILabel! = UILabel()
    @IBOutlet weak var name4: UILabel! = UILabel()
    let MVC = MemberViewcontroller()
    let AddM = AddMember()
    //var TextField:[[UITextField]] = [] 今後
    // viewを生成
    let keyboardView = CustomKeyboard()
    var data = [[Int]]()
    var name = [String]()

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        //配列に入れた
        TextField_player1 = [player1_1,player1_2,player1_3,player1_4,player1_5,player1_6,player1_7,player1_8]
        TextField_player2 = [player2_1,player2_2,player2_3,player2_4,player2_5,player2_6,player2_7,player2_8]
        TextField_player3 = [player3_1,player3_2,player3_3,player3_4,player3_5,player3_6,player3_7,player3_8]
        TextField_player4 = [player4_1,player4_2,player4_3,player4_4,player4_5,player4_6,player4_7,player4_8]

        setKeyboard(textfield: &TextField_player1, keyboardView: keyboardView)
        setKeyboard(textfield: &TextField_player2, keyboardView: keyboardView)
        setKeyboard(textfield: &TextField_player3, keyboardView: keyboardView)
        setKeyboard(textfield: &TextField_player4, keyboardView: keyboardView)

        //変更を受け取れるように設定
        for i in 0 ..< TextField_player1.count {
            TextField_player1[i].addTarget(self, action: #selector(textFieldDidChange1(_:)), for: .editingDidEnd)
            TextField_player2[i].addTarget(self, action: #selector(textFieldDidChange2(_:)), for: .editingDidEnd)
            TextField_player3[i].addTarget(self, action: #selector(textFieldDidChange3(_:)), for: .editingDidEnd)
            TextField_player4[i].addTarget(self, action: #selector(textFieldDidChange4(_:)), for: .editingDidEnd)
        }
        print(MVC.name1)
        print(MVC.name2)
        print(MVC.name3)
        print(MVC.name4)
        name1.text! = MVC.name1
        name2.text! = MVC.name2
        name3.text! = MVC.name3
        name4.text! = MVC.name4
        print(name1.text!)
    }
}
送る前の画面のソースです
------------------------------------------------------------------------
import Foundation
import UIKit

class MemberViewcontroller: UITableViewController {

    // テーブルビュー
    @IBOutlet weak var tableview: UITableView!

    var member_sum = 0
    public var member:[Int] = []
    let cellIdentifier = "namecell"
    let AddM = AddMember()
    var tweets = [String]()
    public var name1 = "arama1"
    public var name2 = "arama2"
    public var name3 = "arama3"
    public var name4 = "arama4"

    override func viewDidLoad() {
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
        // self.navigationItem.rightBarButtonItem = self.editButtonItem()
        var i = 0
        while(AddM.userDefaults.string(forKey: String(i)) != nil){
            tweets.append(AddM.userDefaults.string(forKey: String(i))!)
            i += 1
        }
        /*tweets.append("name")
        tweets.append("name2")
        tweets.append("name3")
        tweets.append("name4")
        tweets.append("name5")
        tweets.append("name6")
         */

        /////////////////
        tableView.dataSource = self
        tableView.delegate = self
        tableView.allowsMultipleSelectionDuringEditing = true

        // trueで複数選択、falseで単一選択
        tableView.allowsMultipleSelection = true

        tableView.tableFooterView = UIView(frame: .zero)

        //self.view.addSubview(tableView)

    }
    ///////
    // セルの選択が外れた時に呼び出される
    override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at:indexPath)
        member_sum -= 1
        //削除したい
        for i in 0 ..< member.count{
            if(member[i]/*入ってる数*/ == indexPath.row/*押されたやつ*/){
                member.remove(at: i)
                print(member)
                break
            }
        }
        //member.
        // チェックマークを外す
        cell?.accessoryType = .none
    }
    //セルが選択された時
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(indexPath)
        member.append(indexPath.row)
        member_sum += 1
        if(member_sum == 4){
            //画面遷移
            print(member)
            //let VC = ViewController()
            name1 = AddM.userDefaults.string(forKey: String(member[0]))!
            name2 = AddM.userDefaults.string(forKey: String(member[1]))!
            name3 = AddM.userDefaults.string(forKey: String(member[2]))!
            name4 = AddM.userDefaults.string(forKey: String(member[3]))!
            print("name1")
            print(name1)
            print("name2")
            print(name2)
            print("name3")
            print(name3)
            print("name4")
            print(name4)
            let targetViewController = self.storyboard!.instantiateViewController( withIdentifier: "main" )
            self.present( targetViewController, animated: true, completion: nil)
            //prepare(for: toViewController, sender: nil)
        }
     //let aCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
     //print()
     }

    /////////

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

    //override
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Potentially incomplete method implementation.
        // Return the number of sections.
        return 1
    }
    //セルの数を返す
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tweets.count
    }
    //セルの生成
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let aCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
        let cell = aCell
        cell.textLabel?.text = tweets[indexPath.row]
        cell.frame = CGRect(x: 0, y: 0, width: 150, height: 750)
        return cell
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50.0
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        print("prepare")
        let VC = segue.destination as! ViewController
        VC.name1.text = "arama"
        VC.name2.text = "arama2"
        VC.name3.text = "arama3"
        VC.name4.text = "arama4"

        /*if segue.identifier == "graph" {
         let secondViewController = segue.destination as! GraphViewController
         secondViewController.aaaaa = aaa
         }*/
    }
    @IBAction func pushCellButton(sender: UIButton) {
        let cell = sender.superview?.superview as! UITableViewCell
        guard let row = self.tableView.indexPath(for: cell)?.row else {

            return
        }
        print(row)
    }
}


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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • fromageblanc

    2017/11/11 18:14

    UserDefaultsに書いた後、syncronize()を試してください

    キャンセル

  • arama

    2017/11/12 23:13

    syncronize()を試してみましたが変わりませんでした...  swift3では非推奨になっていました。

    キャンセル

回答 1

0

2つほど見るべきポイントがあると思います。

まず、送られ先で、let MVC = MemberViewcontroller()をしているため、MemberviewControllerのインスタンスが再作成されてしまっていること
(instantiateViewControllerWithIdentifier()も再作成です)

そして、USerDefaultsに保存しているものの、送り先で取り出してるコードが見当たらないことです。

ちなみにMemberViewcontrollerのプロパティを送り先から参照したいなら、MemberViewcontrollerのインスタンスをなんかに保存しておくのが手っ取り早いかと。

MemberViewcontroller.swift

import UIKit

var gMemberVC:MemberViewController? // global

class MemberViewController: UIViewController {

    var name1:String = "arama1"
    var name2:String = "arama2"
    var name3:String = "arama3"
    var name4:String = "arama4"

    @IBAction func goNext(_ sender:UIButton){

        let targetViewController = self.storyboard!.instantiateViewController( withIdentifier: "main" )
        self.present( targetViewController, animated: true, completion: nil)

    }
    override func viewDidLoad() {
        super.viewDidLoad()

        gMemberVC = self

        name1 = "hoge1"
        name2 = "hoge2"
        name3 = "hoge3"
        name4 = "hoge4"

    }
}


ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        print(gMemberVC?.name1 ?? "") // hoge1
        print(gMemberVC?.name2 ?? "") // hoge2
        print(gMemberVC?.name3 ?? "") // hoge3
        print(gMemberVC?.name4 ?? "") // hoge4


    }
}

UserDefaultsはローカルストレージに関するAPIです。念のため。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Swift

    6068questions

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