遷移先から「戻る」のがどのタイミングなのかご質問だけでは不明ですが、navigationController
を使っていらっしゃるので「Back」ボタンを押したタイミングで戻る、と仮定しました。
やり方は色々あるかと思いますが、
1. 遷移先ではnavigationController
のdelegate
を使って、画面遷移を監視。元の画面に戻る時に遷移元のプロパティ(変数)をセット
2. 遷移元では、プロパティオブザーバを使って値が書き換わった段階で必要な処理を実行
になるのかな、という感じがします。
遷移先で文字を選択し「Back」で戻ると、元の配列に選択した文字が追加され表示されます。
また、選択した文字はprint()
を使ってデバッグウインドウに表示しています。
あとは、必要に応じてお好みの処理にしていただければとおもます。
追加や気づいた点はMARK: 変更
と、追加する処理はMARK: 追加
とコメントしてあります。
特に深い説明はしていませんが、もし分からなければコメントください。
掲載の都合上一つのファイルで実行していますが、もちろんクラス別に分けても構いません。
swift
1 import UIKit
2
3 class ViewController : UIViewController , UITableViewDelegate , UITableViewDataSource {
4 // MARK: 追加
5 // 再表示(reloadData())を実行するため、storyBoard から引っ張っておく
6 @IBOutlet weak var tableView : UITableView !
7
8 // MARK: 変更
9 // 後から書き換えるため変数を var で宣言
10 // プロパティオブザーバを追加し、値が変更された時点で tableView を再読み込みする
11 var array = [ "Next" ] {
12 didSet {
13 // 値が書きかわったら table を再描画
14 tableView . reloadData ( )
15 }
16 }
17 // MARK: 追加
18 // 戻ってきた時に nextViewController で選ばれた文字を入れておく変数
19 var selectedString : String ? {
20 didSet {
21 // 値が書き換わったら
22 // 値は nil 以外になるはずだが、念のため
23 if let selected = selectedString {
24 // ここではコンソールに値を表示しているだけだが、必要に応じて別の処理を行う
25 print ( "selectedString: (selected)" )
26 }
27 }
28 }
29
30 func tableView ( _ tableView : UITableView , numberOfRowsInSection section : Int ) - > Int {
31 // MARK: 変更
32 // いらぬトラブルを避けるためにも、配列の要素数を返した方がいい
33 //return 1
34 return array . count
35 }
36
37 func tableView ( _ tableView : UITableView , cellForRowAt indexPath : IndexPath ) - > UITableViewCell {
38 let cell : UITableViewCell = tableView . dequeueReusableCell ( withIdentifier : "Cell" , for : indexPath )
39 cell . textLabel ? . text = String ( array [ indexPath . row ] )
40 return cell
41 }
42
43 func tableView ( _ tableView : UITableView , didSelectRowAt indexPath : IndexPath ) {
44 performSegue ( withIdentifier : "toNext" , sender : nil )
45 }
46
47 override func viewDidLoad ( ) {
48 super . viewDidLoad ( )
49 }
50 }
51
52 // MARK: 変更
53 // UINavigationControllerDelegate にも準拠させる
54 class nextViewController : UIViewController , UITableViewDelegate , UITableViewDataSource , UINavigationControllerDelegate {
55 let array = [ "A" , "B" , "C" , "D" ]
56 // MARK: 追加
57 // 選択された行を記憶しておく変数
58 // 最初は選択されていないので、Optional型で宣言
59 var selected : Int ?
60
61 func tableView ( _ tableView : UITableView , numberOfRowsInSection section : Int ) - > Int {
62 // MARK: 変更
63 // いらぬトラブルを避けるためにも、配列の要素数を返した方がいい
64 //return 4
65 return array . count
66 }
67
68 func tableView ( _ tableView : UITableView , cellForRowAt indexPath : IndexPath ) - > UITableViewCell {
69 let cell : UITableViewCell = tableView . dequeueReusableCell ( withIdentifier : "Cell" , for : indexPath )
70 cell . textLabel ? . text = String ( array [ indexPath . row ] )
71 return cell
72 }
73
74 override func viewDidLoad ( ) {
75 super . viewDidLoad ( )
76 // MARK: 変更
77 // navigationController の delegate の移譲先
78 navigationController ? . delegate = self
79 }
80
81 // MARK: 追加
82 // セルが押された時の処理
83 func tableView ( _ tableView : UITableView , didSelectRowAt indexPath : IndexPath ) {
84 // 押されたセルの番号(indexPath.row)を記録しておく
85 selected = indexPath . row
86 }
87
88 // MARK: 追加
89 // 戻るボタンが押された時の処理
90 // 実際には、navigationController によって画面が遷移する時に呼び出される
91 func navigationController ( _ navigationController : UINavigationController , willShow viewController : UIViewController , animated : Bool ) {
92 // 次に表示される UIViewController が viewController か否かを判別
93 if let nextVC = viewController as ? ViewController {
94 // selected が nil か否かを判別
95 if let index = selected {
96 print ( array [ index ] )
97 // viewController.selectedString に選択された文字を代入
98 nextVC . selectedString = array [ index ]
99 nextVC . array . append ( array [ index ] )
100 }
101 }
102 }
103 }
呼び出し側で配列を管理する例として、たとえばこのような方法もあります。
swift
1 import UIKit
2
3 class ViewController : UIViewController , UITableViewDelegate , UITableViewDataSource {
4 // MARK: 2020/05/04 追加
5 // 配列はこちらに置く
6 let detailedArray = [ "A" , "B" , "C" , "D" ]
7
8 // MARK: 2020/05/04 追加
9 // performSegue(withIdentifire:sender)が呼び出された後に呼ばれる
10 // この時点で nextViewController はインスタンス化済み
11 override func prepare ( for segue : UIStoryboardSegue , sender : Any ? ) {
12 if let nextVC = segue . destination as ? nextViewController {
13 nextVC . array = detailedArray
14 }
15 }
16
17 // 後は同じ
18 }
19
20 // MARK: 変更
21 // UINavigationControllerDelegate にも準拠させる
22 class nextViewController : UIViewController , UITableViewDelegate , UITableViewDataSource , UINavigationControllerDelegate {
23 // MARK: 2020/05/04 変更
24 // array はオプショナル型の配列として宣言しておく。
25 // 具体的な値を入れるのは、viewControllerのprepareメソッドで行っている
26 var array : [ String ] !
27
28 // 後は同じ
29 }
segue
を使って画面遷移を行なっているので、prepare
メソッド内で遷移先のクラスにアクセスし、そこに値を入れています。
もちろん、これ以外にもいろいろなパターンが考えられると思いますが、ひとつの参考にしていただければと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/05/04 05:51
2020/05/04 06:53
退会済みユーザー
2020/05/04 07:30
2020/05/04 07:46
退会済みユーザー
2020/05/04 08:47
2020/05/04 08:58
2020/05/04 09:57
退会済みユーザー
2020/05/05 14:56