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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

2回答

4113閲覧

IndexPath.rowで配列から値を取得できない

Susanoo2442

総合スコア153

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2016/09/22 17:09

編集2016/09/23 07:44

###開発環境

  • Swfit3
  • Xcode8

###実現したい事

現在アプリを開発しています。
遷移元の二つのテキストフィールドに文字を入力してボタンを押すと
二つのテキストフィールドの値がUserDefaultsに保存されて
遷移先のページでUserDdfaultsを読み込み
遷移先のページのTableViewCellに二つ配置してあるラベルを二つとも書き換えるといった事がしたいです。

ちなみに、現段階では一つ目のラベルの文字を書き換えるということはできております。

###問題点

しかしながら、もう片方のラベルの値を書き換える事ができておりません。
ラベルの値は両方とも配列からindexPath.rowで取得してきております。
しかし、配列から値を取り出すときに両方の配列にindexpath.rowを指定して
配列を取り出そうとしたらアプリがクラッシュして落ちてしまいます。

###試してみた事

配列から値を取り出すときにindexpath.rowで値を取り出すのではなく0や1を指定してみましたけど
アプリはクラッシュしませんでしたが
遷移元のテキストフィールドで値を入力したにもかかわらず
遷移先のもう片方のラベルは全くかわっておりませんでした。

###アドバイスして頂きたい事
遷移先のページに配置してあるラベルを両方とも変更できるよう
アドバイスして頂けたらと思います。
また、差し支えないようでしたら
indexpath.rowの扱い方をざっとで構いませんので
教えて頂けたらと思います。

Swift

1 2//遷移元のViewControllerです。 3import Foundation 4import UIKit 5 6class FirstViewController: UIViewController{ 7 8 9 10 let userDefaults = UserDefaults.standard 11 12 var Savehozon: String? 13 14 var Savehozon2: String? 15 16 17 18 19 20 @IBOutlet weak var MyText: UITextField! 21 22 @IBOutlet weak var MyText2: UITextField! 23 24 25 @IBAction func AddAction(_ sender: AnyObject) { 26 27 28 29 Savehozon2 = MyText2.text! 30 31 Savehozon = MyText.text! 32 33 34 35 36 //ここから 37 38 if var result = userDefaults.object(forKey: "ReciveSave") as? Array<String> { 39 result.append(Savehozon!) 40 41 userDefaults.set(result, forKey:"ReciveSave") 42 } else { 43 userDefaults.set([Savehozon!], forKey:"ReciveSave") 44 } 45 46 userDefaults.synchronize() 47 48 //ここまでが一つ目のラベルを書き換えるためのuserdefaultsのコードです。 49 50 51 52 //ここから 53 if var result2 = userDefaults.object(forKey: "ReciveSave2") as? Array<String> { 54 55 56 result2.append(Savehozon2!) 57 58 59 userDefaults.set(result2, forKey: "ReciveSave2") 60 61 }else { 62 63 userDefaults.set([Savehozon2!], forKey:"ReciveSave2") 64 65 } 66 67 68 userDefaults.synchronize() 69 70 //ここまでが二つ目のUserDefaultsを書き換えるためのUserdefaultsのコードです。 71 72 73 74 75 76 77 } 78 79 80 override func viewDidLoad() { 81 super.viewDidLoad() 82 83 84 85 } 86 87 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 88 view.endEditing(true) 89 } 90 91 override func didReceiveMemoryWarning() { 92 super.didReceiveMemoryWarning() 93 } 94 95 96 97 98 99 100 101} 102 103 104 105 106 107 108

Swift

1 2 3 4//遷移先のViewControllerです。 5import Foundation 6import UIKit 7 8 9 10class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 11 12 13 14 var ReciveData: [String] = [] 15 16 17 var ReciveData2: [String] = [] 18 19 20 21 22 23 let userDefaults = UserDefaults.standard 24 25 26 27 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 28 29 30 31 32 let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for:indexPath) 33 34 let label = cell.viewWithTag(1) as! UILabel 35 //ここで一つ目のラベルを書き換えいます。 36 label.text = ReciveData[indexPath.row] 37 38 39 40 /*ここで二つ目のラベルを書き換えるための処理を書いたつもりなのですが 41 ここで、エラーが起きてアプリがクラッシュしてしまいます。 42 エラーコードはThred1 Exc_Bad Instraction(code=EXCi386?INVOP. sub 43 code= 0x0)です。*/ 44 let label2 = cell.viewWithTag(2) as! UILabel 45 46 label2.text = ReciveData2[indexPath.row] 47 48 49 50 51 return cell 52 53 54 55 56 57 } 58 59 60 61 62 63 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 64 65 66 67 68 69 70 71 return ReciveData.count 72 73 74 75 76 77 78 79 80 81 } 82 83 84 85 86 87 88 89 90 91 override func viewDidLoad() { 92 super.viewDidLoad() 93 94 95 96 if let result = userDefaults.object(forKey: "ReciveSave") as? Array<String>{ 97 98 99 ReciveData = result 100 101 } 102 103 104 if let result2 = userDefaults.object(forKey: "ReciveSave2") as? Array<String>{ 105 106 107 108 ReciveData2 = result2 109 110 111 112 113 114 115 } 116 117 118 119 120 121 122 123 } 124 125 126 127 128 129 130 override func didReceiveMemoryWarning() { 131 super.didReceiveMemoryWarning() 132 133 } 134 135 136 137 138} 139 140 141 142

以上でございます。
それでは、よろしくお願い致します。

###追記

記載するの忘れてました。
Swiftのバージョンは3です
xcodeは8です。

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問1

落ちる行の上に下記のコードを追加して、落ちた時に最後に表示されたログを教えて下さい。

swift

1print(cell.viewWithTag(2)) //追加 2let label2 = cell.viewWithTag(2) as! UILabel

質問2

落ちる行を下記のコードに差し替えるとどうなるでしょうか?

swift

1let label2 = cell.contentView.viewWithTag(2) as! UILabel

質問3

ReciveData2の中身が無い、もしくは、足りないようです。

SecondViewControllerのviewDidLoadの最後に下記のコードを追加して、出力されたログを教えて下さい。(それぞれ最初の5行程度でいいです)

swift

1print("ReciveData(\(ReciveData))=", ReciveData) 2print("ReciveData2(\(ReciveData2))=", ReciveData2)

あと、label2の設定をしている箇所を下記のコードに差し替えると、とりあえず落ちなくなると思います。

swift

1if indexPath.row < ReciveData2.count { 2 label2.text = ReciveData2[indexPath.row] 3} else { 4 label2.text = "error(\(indexPath.row)/\(ReciveData2.count))" 5}

投稿2016/09/23 08:07

編集2016/09/23 09:06
fuzzball

総合スコア16731

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

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

Susanoo2442

2016/09/23 08:33

回答ありがとうございます。 質問2のコードを試しましたが 落ちてしまいました。 最後に表示されたエラーログは fatal error: Index out of rangeになります。 それと私のコメントアウトの位置が悪かったのですが エラーコードを吐いた箇所は 正確にはSecondViewControllerの //この行の let label2 = cell.viewWithTag(2) as! UILabel       //一個下のこの行になります。   label2.text = ReciveData2[indexPath.row] お手数おかけしますが 何卒宜しくお願い致します。
fuzzball

2016/09/23 09:07

質問3を追記しました。
Susanoo2442

2016/09/23 09:29

回答ありがとうございます。 ログを取得してまいりました。 Will attempt to recover by breaking constraint <NSLayoutConstraint:0x618000095a40 UIScrollView:0x7fc253017a00.height == 1042 (active)> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 2016-09-23 18:19:38.074796 iPhoneMock[7573:2535391] subsystem: com.apple.BackBoardServices.fence, category: App, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0 2016-09-23 18:19:39.503508 iPhoneMock[7573:2535391] subsystem: com.apple.UIKit, category: Touch, enable_level: 0, persist_level: 0, default_ttl: 1, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0 このようなログが出力されていました。 それと、おっしゃられました通り if文を書く事によりエラーは回避できました。 二つ目のラベルにエラーと表示されていませんでしたので やはりReciveData2にうまく値が入ってないんだと思います。 コードの書き方が悪いのでしょうか?? それとも他に原因があるのでしょうか。 お手数おかけしますが 宜しくお願い致します。
fuzzball

2016/09/23 09:56

そのログは今回の件とは関係ないログですね。今回欲しかったのは「ReciveData(数字)=...」「ReciveData2(数字)=...」みたいなログです。 >>二つ目のラベルにエラーと表示されていませんでしたので エラーと表示されてなかったんですか??「error(数字)」って表示されていませんでしたか? 原因は、ReciveDataの数と、ReciveData2の数が一致していないことです。 今の段階では、なぜ一致していないかは分かりません。 例えば、最初はReciveDataだけだったのに、途中からReciveData2を追加したので、最初の頃に追加したデータにはReciveData2が無い、とか。 この場合は、一度アプリを削除すれば直ります。
Susanoo2442

2016/09/23 10:10

すいません この箇所は誤字でした。>>二つ目のラベルにエラーと表示されていませんでしたので 二つ目のラベルにはエラーと表示されていました! あと、エラーのログなんですけど もしかして ReciveData = ([string)] 〇〇 Values ←このような感じのやつですか?? だとしたら ログにはこう書かれてありました。 ReciveData[(string)] = 29 Vaules ReciveData2[(string)] = 27 Vaules とかかれていて確かに両者のVaulesの数は違っていましたし。 fuzzball様のおっしゃられる通り最初から Cellにラベルを二つ追加していたわけではありません。 二つ目は、一つ目のコーディングが終わってから 追加しました。
fuzzball

2016/09/23 10:26

>>ログ それです。2つ少ないですね。(ReciveData2が無いときに追加したデータが2つある) ということで、今回の件に関しては、一旦アプリを削除すれば直ります。 最後に、前から気になっていたのですが、レシーブの綴りは receive です。
Susanoo2442

2016/09/23 11:12

やはりそちらのログでしたか。 お手数おかけしまして 申し訳ございませんでした。 長らく付き合って頂いてありがとうございました。 Reciveではなく・・・ Receveですね笑 覚えておきます! ありがとうございました!
Susanoo2442

2016/09/23 11:40

fuzzball様 やはり、値が噛み合ってないのが 原因でした。 アプリを消さずに 片方のラベルだけを実行させて 値を二つ増やしてみたら 無事エラーが起きずに ラベルを両方とも変更する事が出来ました。 ありがとうございました!
guest

0

セルに乗っているラベルのタグが2になっていないようで、ラベルを取得できないためのエラーですね。

Storyboardに載せているラベルのタグに2を設定してください。

indexPathに関しては古い記事ですが以下の記事を参考にしてみてください。
[XCODE] NSIndexPathとは?作り方や使い方も
UITableViewの基礎的な使い方

投稿2016/09/22 23:22

編集2016/09/23 00:18
_Kentarou

総合スコア8490

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

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

Susanoo2442

2016/09/23 06:27

回答ありがとうございます。 二つ目のラベルのtagは2に設定しているのですが このエラーが出てしまいます。 と、なりましたら 何かが原因でラベルのtagが取得できてないかと思うのですが・・・ 検討すら付かない次第であります。 もう少しだけアドバイス頂けたらと思います。 宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問