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

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

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

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

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

1949閲覧

swiftでの画面移動の際の呼び出し

tayu

総合スコア11

iOS

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

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2016/04/24 13:02

swiftで画面移動する際にAppDekegateに数値を保管して
移動先でそれを扱い表示するというものを組んでいるのですが
1回目の移動ではnilになってしまい一度移動元に戻り再度移動すると
先ほどアクセスしたデータが表示されます。
例としては
1回目:A(移動元)→B(移動先) この時データはnil
2回目:一回目→A(移動元)→B(移動先) こうすると一回目のデータ
を表示してしまいます。

どうすればいいでしょうか?

swift

1//移動元cell選択した時の処理 2func tableView(table: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 3 selected_num = indexPath.row 4 let appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 5 appDelegate.img = send_pic[selected_num] 6 appDelegate.tit = send_title[selected_num] 7 appDelegate.address = rest[selected_num].objectForKey("address") as? String 8 appDelegate.tel = rest[selected_num].objectForKey("tel") as? String 9 appDelegate.time = rest[selected_num].objectForKey("opentime") as? String 10 }

swift

1//移動先boardで戻るボタンを設置してあります 2class status: UIViewController { 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 let appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 6 img_view.image = appDelegate.img 7 img_view.contentMode = UIViewContentMode.ScaleAspectFit 8 title_view.text = appDelegate.tit 9 time_view.text = appDelegate.time 10 tel_view.text = appDelegate.tel 11 address_view.text = appDelegate.address 12 print(appDelegate.time) 13 print(appDelegate.tel) 14 print(appDelegate.address) 15 16 } 17 override func didReceiveMemoryWarning() { 18 super.didReceiveMemoryWarning() 19 } 20}

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

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

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

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

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

guest

回答2

0

既に試していたら申し訳ないですが、viewDidLoadのほうがtableViewのメソッドより先に呼ばれていないでしょうか?
ブレイクポイントを両方にうって実行した際に、viewDidLoadが先にヒットしませんか。

実は私も似たようなことではまったことがありましたので。。。
既に試した結果の投稿でしたら失礼しました。

投稿2016/04/26 00:19

yosuke_

総合スコア10

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

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

0

ベストアンサー

各画面のデータ渡しを全てAppDelegateにプロパティを持たせて行うのは無理がくると思います。
説明を全て記述できませんが、DataModelのようなクラスを使用して受け渡しするのが良いと思います。

データモデルクラス

swift

1// DataModelクラス 2class DataModel: NSObject { 3 var img: UIImage! 4 var title: String! 5 var address: String? 6 var tel: String? 7 var time: String? 8}

遷移前画面

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 // DataModelの配列 6 var dataModel: [DataModel] = [] 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 } 12 13 func tableView(table: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 14 15 // dataModel配列の中で押下されたセルのデータを遷移先に渡す 16 // identifireはStoryboardで設定 17 performSegueWithIdentifier("identifire", sender: dataModel[indexPath.row]) 18 } 19 20 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 21 22 // 遷移先オブジェクトを取得してプロパティにdataModelを設定 23 guard let nextViewController = segue.destinationViewController as? NextViewController else { return } 24 nextViewController.dataModel = sender as! DataModel 25 } 26 27 override func didReceiveMemoryWarning() { 28 super.didReceiveMemoryWarning() 29 30 } 31}

遷移先画面

swift

1 2import UIKit 3 4class NextViewController: UIViewController { 5 6 // 遷移前画面からデータをセット 7 var dataModel: DataModel! 8 9 @IBOutlet weak var img_view: UIImageView! 10 @IBOutlet weak var title_view: UILabel! 11 @IBOutlet weak var time_view: UILabel! 12 @IBOutlet weak var tel_view: UILabel! 13 @IBOutlet weak var address_view: UILabel! 14 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 19 // dataModelから各データをプロパティに設定 20 img_view.image = dataModel.img 21 img_view.contentMode = UIViewContentMode.ScaleAspectFit 22 title_view.text = dataModel.title 23 time_view.text = dataModel.time ?? "" 24 tel_view.text = dataModel.tel ?? "" 25 address_view.text = dataModel.address ?? "" 26 } 27}

投稿2016/04/24 15:16

編集2016/04/24 23:04
_Kentarou

総合スコア8490

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問