teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

コードを差し替えました。View間の構造のスクショを載せました。

2021/02/18 15:07

投稿

sta_sato
sta_sato

スコア2

title CHANGED
File without changes
body CHANGED
@@ -1,26 +1,17 @@
1
1
  ### 前提・実現したいこと
2
2
  delegateを使って下記の処理を実現したいです。
3
3
 
4
- A、Bという2つの画面があり、A画面内のボタンを押すと、
5
- B画面に定義してるtableView更新する。
4
+ 「Top画面」とう画面の上に、containerView配置し、
5
+ containerViewの上にViewを配置しています。
6
6
 
7
- (追記)
8
- A画面の上に、Viewがあり、このViewの下に、ContentViewBがあります。
9
- ContentViewBに対して、ViewControllerB設定しています。
7
+ Top画面に対して、クラス:ViewController割り当います。
10
- (名前がわかりづらくなってしまっていますが、ContainerA~Cのうち、
11
- ContainerAに設定しているクラスをviewControllerBとして質問を書いています)
8
+ ![イメージ説明](4de89470ec31d3689f323855d752dd85.png)
12
9
 
10
+ Top画面の配下のViewの、さらに配下のCotainerAに、
11
+ 下記の「冷蔵庫画面」を配置していて、クラス:cabinViewControllerを設定しています。
13
- ![![イメージ説明](59b57ac798e6f7d819d245035f6f2818.png)](24d374ba135c20cb149c090afcf450da.png)
12
+ ![イメージ説明](fc13ce6538de8093cd52d02c0b378594.png)
14
13
 
15
-
16
- A画面のクラス:viewControllerA
17
- B画面のクラス:viewControllerB
18
-
19
- 上記を、delegateを使って実装したいため、
20
- A画面のボタンを押したら、viewControllerBでtableViewを更新する処理を実現したいです。
21
-
22
14
  ※delegateについての私の理解(間違いありましたらご指摘ください)
23
-
24
15
  delegateとは、自分のクラスの処理内容を他のクラスに実行してもらう(移譲する)こと。
25
16
  下記の実装が必要。
26
17
  ①protcolの定義
@@ -42,9 +33,9 @@
42
33
 
43
34
  ```
44
35
 
45
- viewControllerB
36
+ CabinviewController(冷蔵庫画面)
46
37
  ```swift
47
- class CabinViewController:UIViewController, UITableViewDelegate, UITableViewDataSource, ReloadDataDelegate {
38
+ class CabinViewController:UIViewController, UITableViewDelegate, UITableViewDataSource, UINavigationControllerDelegate,ReloadDataDelegate {
48
39
 
49
40
  @IBOutlet weak var myTableView: UITableView!
50
41
 
@@ -62,38 +53,39 @@
62
53
  }
63
54
  ```
64
55
 
65
- viewControllerA
56
+ ViewController(TOP画面)
66
57
  ```swift
67
- class ViewController: UIViewController, {
58
+ class ViewController: UIViewController, UINavigationControllerDelegate {
68
59
 
69
60
  var delegate:ReloadDataDelegate!
70
-    
61
+
71
-   //A画面に載っけるViewの定義
62
+ // MARK: - ContainerView
72
- @IBOutlet weak var containerView: UIView!
73
63
  var containers:Array<UIView>=[]
64
+ @IBOutlet weak var containerA: UIView!
65
+ @IBOutlet weak var containerB: UIView!
66
+ @IBOutlet weak var containerC: UIView!
74
67
 
68
+
75
69
  override func viewDidLoad() {
76
70
  super.viewDidLoad()
77
71
 
78
- let viewControllerB = ViewControllerB()
72
+ let cabinVC = CabinViewController()
79
- self.delegate = viewControllerB
73
+ self.delegate = cabinVC
80
74
 
81
-   //A画面の上のContentViewとして配置しているB画面を表示(名前がややこしくてすみません)
82
75
  containers=[containerA,containerB,containerC]
83
76
  containerView.bringSubviewToFront(containers[containerIndex])
84
77
  }
85
78
 
86
79
  ~(中略)~
87
- //MARK:- segmentBarの値に応じて、スクロール位置変更
80
+ //MARK:- segmentBarの値に応じて、containerViewの表示切り替え
88
81
  @IBAction func SegmentAction(_ sender: UISegmentedControl) {
89
- // let selectedIndex = segmentBar.selectedSegmentIndex
82
+
90
-
91
83
  let currentContainerView=containers[sender.selectedSegmentIndex]
92
84
  containerView.bringSubviewToFront(currentContainerView)
93
-
94
85
  }
95
86
 
96
87
  ~(中略)~
88
+ //NavigationBarのボタン
97
89
  @IBAction func templateButton(_ sender: Any) {
98
90
  reload()
99
91
  }
@@ -106,8 +98,7 @@
106
98
  ```
107
99
 
108
100
  ### 試したこと
109
- 実行すると、reloadTabeleDate()内の、
110
- "test"の出力がされることは確認しています。
101
+ 実行すると、reloadTabeleDate()内の、"test"の出力がされることは確認しています。
111
102
 
112
103
  ### 補足情報(FW/ツールのバージョンなど)
113
104
  Swift 5.X

1

A画面とB画面の関係性を追記しました。B画面を表示している処理を追記しました。コードの誤りを修正しました。

2021/02/18 15:07

投稿

sta_sato
sta_sato

スコア2

title CHANGED
File without changes
body CHANGED
@@ -4,6 +4,15 @@
4
4
  A、Bという2つの画面があり、A画面内のボタンを押すと、
5
5
  B画面に定義しているtableViewを更新する。
6
6
 
7
+ (追記)
8
+ A画面の上に、Viewがあり、このViewの下に、ContentViewBがあります。
9
+ ContentViewBに対して、ViewControllerBを設定しています。
10
+ (名前がわかりづらくなってしまっていますが、ContainerA~Cのうち、
11
+ ContainerAに設定しているクラスをviewControllerBとして質問を書いています)
12
+
13
+ ![![イメージ説明](59b57ac798e6f7d819d245035f6f2818.png)](24d374ba135c20cb149c090afcf450da.png)
14
+
15
+
7
16
  A画面のクラス:viewControllerA
8
17
  B画面のクラス:viewControllerB
9
18
 
@@ -39,9 +48,6 @@
39
48
 
40
49
  @IBOutlet weak var myTableView: UITableView!
41
50
 
42
- //処理実行イベントを通知する先
43
- weak var delegate:ViewController! = nil
44
-
45
51
  override func viewDidLoad() {
46
52
  super.viewDidLoad()
47
53
  myTableView.delegate = self
@@ -60,15 +66,34 @@
60
66
  ```swift
61
67
  class ViewController: UIViewController, {
62
68
 
69
+ var delegate:ReloadDataDelegate!
70
+    
71
+   //A画面に載っけるViewの定義
72
+ @IBOutlet weak var containerView: UIView!
73
+ var containers:Array<UIView>=[]
74
+
63
75
  override func viewDidLoad() {
64
76
  super.viewDidLoad()
65
77
 
66
78
  let viewControllerB = ViewControllerB()
67
79
  self.delegate = viewControllerB
80
+
81
+   //A画面の上のContentViewとして配置しているB画面を表示(名前がややこしくてすみません)
82
+ containers=[containerA,containerB,containerC]
83
+ containerView.bringSubviewToFront(containers[containerIndex])
68
84
  }
69
85
 
70
86
  ~(中略)~
87
+ //MARK:- segmentBarの値に応じて、スクロール位置を変更
88
+ @IBAction func SegmentAction(_ sender: UISegmentedControl) {
89
+ // let selectedIndex = segmentBar.selectedSegmentIndex
90
+
91
+ let currentContainerView=containers[sender.selectedSegmentIndex]
92
+ containerView.bringSubviewToFront(currentContainerView)
93
+
94
+ }
71
95
 
96
+ ~(中略)~
72
97
  @IBAction func templateButton(_ sender: Any) {
73
98
  reload()
74
99
  }
@@ -76,6 +101,7 @@
76
101
  func reload() {
77
102
  self.delegate?.reloadTabeleDate()
78
103
  }
104
+ }
79
105
 
80
106
  ```
81
107