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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Swift

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

Q&A

1回答

2829閲覧

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

arama

総合スコア13

Swift

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

0グッド

0クリップ

投稿2017/11/11 07:20

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

swift

1送られた先の画面のソースです 2import UIKit 3 4class ViewController: UIViewController { 5 6 @IBOutlet weak var name1: UILabel! = UILabel() 7 @IBOutlet weak var name2: UILabel! = UILabel() 8 @IBOutlet weak var name3: UILabel! = UILabel() 9 @IBOutlet weak var name4: UILabel! = UILabel() 10 let MVC = MemberViewcontroller() 11 let AddM = AddMember() 12 //var TextField:[[UITextField]] = [] 今後 13 // viewを生成 14 let keyboardView = CustomKeyboard() 15 var data = [[Int]]() 16 var name = [String]() 17 18 override func viewDidAppear(_ animated: Bool) { 19 super.viewDidAppear(animated) 20 //配列に入れた 21 TextField_player1 = [player1_1,player1_2,player1_3,player1_4,player1_5,player1_6,player1_7,player1_8] 22 TextField_player2 = [player2_1,player2_2,player2_3,player2_4,player2_5,player2_6,player2_7,player2_8] 23 TextField_player3 = [player3_1,player3_2,player3_3,player3_4,player3_5,player3_6,player3_7,player3_8] 24 TextField_player4 = [player4_1,player4_2,player4_3,player4_4,player4_5,player4_6,player4_7,player4_8] 25 26 setKeyboard(textfield: &TextField_player1, keyboardView: keyboardView) 27 setKeyboard(textfield: &TextField_player2, keyboardView: keyboardView) 28 setKeyboard(textfield: &TextField_player3, keyboardView: keyboardView) 29 setKeyboard(textfield: &TextField_player4, keyboardView: keyboardView) 30 31 //変更を受け取れるように設定 32 for i in 0 ..< TextField_player1.count { 33 TextField_player1[i].addTarget(self, action: #selector(textFieldDidChange1(_:)), for: .editingDidEnd) 34 TextField_player2[i].addTarget(self, action: #selector(textFieldDidChange2(_:)), for: .editingDidEnd) 35 TextField_player3[i].addTarget(self, action: #selector(textFieldDidChange3(_:)), for: .editingDidEnd) 36 TextField_player4[i].addTarget(self, action: #selector(textFieldDidChange4(_:)), for: .editingDidEnd) 37 } 38 print(MVC.name1) 39 print(MVC.name2) 40 print(MVC.name3) 41 print(MVC.name4) 42 name1.text! = MVC.name1 43 name2.text! = MVC.name2 44 name3.text! = MVC.name3 45 name4.text! = MVC.name4 46 print(name1.text!) 47 } 48} 49送る前の画面のソースです 50------------------------------------------------------------------------ 51import Foundation 52import UIKit 53 54class MemberViewcontroller: UITableViewController { 55 56 // テーブルビュー 57 @IBOutlet weak var tableview: UITableView! 58 59 var member_sum = 0 60 public var member:[Int] = [] 61 let cellIdentifier = "namecell" 62 let AddM = AddMember() 63 var tweets = [String]() 64 public var name1 = "arama1" 65 public var name2 = "arama2" 66 public var name3 = "arama3" 67 public var name4 = "arama4" 68 69 override func viewDidLoad() { 70 super.viewDidLoad() 71 72 // Uncomment the following line to preserve selection between presentations 73 // self.clearsSelectionOnViewWillAppear = false 74 75 // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 76 // self.navigationItem.rightBarButtonItem = self.editButtonItem() 77 var i = 0 78 while(AddM.userDefaults.string(forKey: String(i)) != nil){ 79 tweets.append(AddM.userDefaults.string(forKey: String(i))!) 80 i += 1 81 } 82 /*tweets.append("name") 83 tweets.append("name2") 84 tweets.append("name3") 85 tweets.append("name4") 86 tweets.append("name5") 87 tweets.append("name6") 88 */ 89 90 ///////////////// 91 tableView.dataSource = self 92 tableView.delegate = self 93 tableView.allowsMultipleSelectionDuringEditing = true 94 95 // trueで複数選択、falseで単一選択 96 tableView.allowsMultipleSelection = true 97 98 tableView.tableFooterView = UIView(frame: .zero) 99 100 //self.view.addSubview(tableView) 101 102 } 103 /////// 104 // セルの選択が外れた時に呼び出される 105 override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { 106 let cell = tableView.cellForRow(at:indexPath) 107 member_sum -= 1 108 //削除したい 109 for i in 0 ..< member.count{ 110 if(member[i]/*入ってる数*/ == indexPath.row/*押されたやつ*/){ 111 member.remove(at: i) 112 print(member) 113 break 114 } 115 } 116 //member. 117 // チェックマークを外す 118 cell?.accessoryType = .none 119 } 120 //セルが選択された時 121 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 122 print(indexPath) 123 member.append(indexPath.row) 124 member_sum += 1 125 if(member_sum == 4){ 126 //画面遷移 127 print(member) 128 //let VC = ViewController() 129 name1 = AddM.userDefaults.string(forKey: String(member[0]))! 130 name2 = AddM.userDefaults.string(forKey: String(member[1]))! 131 name3 = AddM.userDefaults.string(forKey: String(member[2]))! 132 name4 = AddM.userDefaults.string(forKey: String(member[3]))! 133 print("name1") 134 print(name1) 135 print("name2") 136 print(name2) 137 print("name3") 138 print(name3) 139 print("name4") 140 print(name4) 141 let targetViewController = self.storyboard!.instantiateViewController( withIdentifier: "main" ) 142 self.present( targetViewController, animated: true, completion: nil) 143 //prepare(for: toViewController, sender: nil) 144 } 145 //let aCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) 146 //print() 147 } 148 149 ///////// 150 151 override func didReceiveMemoryWarning() { 152 super.didReceiveMemoryWarning() 153 // Dispose of any resources that can be recreated. 154 } 155 156 // MARK: - Table view data source 157 158 //override 159 func numberOfSectionsInTableView(tableView: UITableView) -> Int { 160 // #warning Potentially incomplete method implementation. 161 // Return the number of sections. 162 return 1 163 } 164 //セルの数を返す 165 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 166 return tweets.count 167 } 168 //セルの生成 169 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 170 let aCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) 171 let cell = aCell 172 cell.textLabel?.text = tweets[indexPath.row] 173 cell.frame = CGRect(x: 0, y: 0, width: 150, height: 750) 174 return cell 175 } 176 177 override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 178 return 50.0 179 } 180 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 181 print("prepare") 182 let VC = segue.destination as! ViewController 183 VC.name1.text = "arama" 184 VC.name2.text = "arama2" 185 VC.name3.text = "arama3" 186 VC.name4.text = "arama4" 187 188 /*if segue.identifier == "graph" { 189 let secondViewController = segue.destination as! GraphViewController 190 secondViewController.aaaaa = aaa 191 }*/ 192 } 193 @IBAction func pushCellButton(sender: UIButton) { 194 let cell = sender.superview?.superview as! UITableViewCell 195 guard let row = self.tableView.indexPath(for: cell)?.row else { 196 197 return 198 } 199 print(row) 200 } 201} 202

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fromageblanc

2017/11/11 09:14

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

2017/11/12 14:13

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

回答1

0

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

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

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

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

MemberViewcontroller.swift

Swfit

1import UIKit 2 3var gMemberVC:MemberViewController? // global 4 5class MemberViewController: UIViewController { 6 7 var name1:String = "arama1" 8 var name2:String = "arama2" 9 var name3:String = "arama3" 10 var name4:String = "arama4" 11 12 @IBAction func goNext(_ sender:UIButton){ 13 14 let targetViewController = self.storyboard!.instantiateViewController( withIdentifier: "main" ) 15 self.present( targetViewController, animated: true, completion: nil) 16 17 } 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 21 gMemberVC = self 22 23 name1 = "hoge1" 24 name2 = "hoge2" 25 name3 = "hoge3" 26 name4 = "hoge4" 27 28 } 29} 30

ViewController.swift

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view, typically from a nib. 8 9 print(gMemberVC?.name1 ?? "") // hoge1 10 print(gMemberVC?.name2 ?? "") // hoge2 11 print(gMemberVC?.name3 ?? "") // hoge3 12 print(gMemberVC?.name4 ?? "") // hoge4 13 14 15 } 16} 17 18

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

投稿2017/11/13 02:58

fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問