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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

863閲覧

引数で他クラスのUIViewの値を変更したい

soujomitsuura

総合スコア24

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クリップ

投稿2018/02/06 11:08

こんにちは。

他のクラスのUIViewの値を(例えばsomeView.alphaの値など)引数を利用してボタンを押した時に変更したいのですが、変更されません。
下記のコードですが、ボタンを押した時にそれぞれのcaseまでは到達しているようですが(printで確認しました)、目的のviewのプロパティの値が変わりません。
ちなみに初期状態(ViewDidLoad)では変更されるようです。

ボタンを押した時に値を変更するにはどうすれば良いか教えてください。

swift

1//ViewController.swift 2class ViewController: UIViewController { 3 4 @IBOutlet weak var vHome: UICollectionView! 5 @IBOutlet weak var vSearch: UICollectionView! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 selectRd(rd: 3) //ViewDidLoadなんかの初期値では変更できるようです 10 11 } 12} 13 14extension ViewController { 15 16 func selectRd(rd reader:Int){ 17 18 var animateView:UIView! 19 20 let animateVHome = vHome 21 let animateVSearch = vSearch 22 23 UIView.animate(withDuration: 0.3, delay: 0.0, animations: { 24 animateVHome.alpha = 0.0 25 animateVSearch.alpha = 0.0 26 }, completion: nil) 27 28 switch reader { 29 case 2: 30 animateView = animateVHome 31 case 3: 32 animateView = animateVSearch 33 default: 34 break 35 } 36 37 UIView.animate(withDuration: 0.3, delay: 0.3, animations: { 38 animateView.alpha = 1.0 39 }, completion: nil) 40 } 41 42}

swift

1class Another{ 2 @objc func buttonTapped(sender : HeaderButton) { 3 let vC = ViewController 4 vC.selectRd(rd: 2) //このボタンを押した時が変更されません。caseまでは行ってます。 5 } 6}

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

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

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

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

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

guest

回答2

0

viewDidLoadが呼ばれないとStoryBoardで作成したViewは生成されません。
どうしても、そのタイミングで行いたいのであれば、以下のように強制的にviewを呼び出すという方法があります。
基本、このような記述はテストコードなどでやる手法であり、プロダクトコードで記述するのは邪道な気もします。

Swift

1class Another{ 2 @objc func buttonTapped(sender : HeaderButton) { 3 let vC = ViewController 4 _ = vc.view 5 vC.selectRd(rd: 2) 6 } 7}

投稿2018/02/06 14:00

nakasho_dev

総合スコア2655

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

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

soujomitsuura

2018/02/06 15:04

回答ありがとうございます。 ん〜なるほど、クラスを跨いだボタンイベント処理って通例って訳ではないようですね。 自分は別なインスタンスを生成しているから変更が反映されないのではないかと思い、 同じ動作をdelegateを使ってやってみましたが、結果はダメでした。 2重質問になってしまうんですが、核心のところが聞きたいです。 これは呼び出すviewのタイミングの問題なのでしょうか? 自分のもともとの考えですと、viewDidLoadでStoryboardからの表示がなされて入れば 他のクラスからであろうと、インスタンス生成であろうが、デリゲートであろうが 今回のように値を変更できると考えていたのです。
soujomitsuura

2018/02/06 15:12

すいません、回答いただいた内容でも動きませんでした。 もう少し検証を続けます。
nakasho_dev

2018/02/06 15:37

StoryBoardを使わない手法しか本格的な開発の経験がないので、何か間違っていたかもしれません。すいません。 selectRdでは設定のみ実施し、viewWillAppearでアニメーションを実装するのはいかがでしょうか。
soujomitsuura

2018/02/06 16:06

回答ありがとうございます。 とんでもないです。回答いただけただけでも感謝いたします。私の説明不足も災いしてるでしょう。 今回の件は他のクラスからUIViewController内で定義されたクラスのプロパティの何らかの値さえ変更できればよかったのですが、それができないのはバグなのか、またはその定義されたクラスがxibから出力されてるからかもしれません。 いずれにせよ、検証を続けます。 答えが出次第再度、かいとうとして掲載しようと思います。
fuzzball

2018/02/07 00:52 編集

無理やりviewDidLoadを呼び出すにしても、ViewControllerをStoryboardから生成しないといけません。(そもそも let vC = ViewController はエラーになると思うのですが‥) こんな感じ。("Main"はStoryboardの名前、"vc"はStoryboard ID) if let vc = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "vc") as? ViewController { _ = vc.view vc.selectRd(rd: 2) } まぁ、こんなことはやるもんじゃないですよ。
soujomitsuura

2018/02/07 03:19

みなさんコメントいただきありがとうございました。 この質問は解決しました。 自己解決に内容を書いておきます。
guest

0

自己解決

自己解決しました。

今回の質問は"ボタンを押した時に別クラスの値を変更する"を目的としていました。
結論はdelegateを踏むと解決できました。
別質問でdelegateの場合を回答していただき、解決しました。
https://teratail.com/questions/112360

簡素に書くと下記のようになります。

swift

1//ViewController.swift 2class ViewController: UIViewController { 3 4 let someView = SomeView.instance() 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 self.view.addSubView(someView) 9 } 10} 11 12extension ViewController: Change{ //➡️継承によりこのクラス内で適用できるようにする。 13 14 someView.delegate = self //➡️プロトコル内のメソッドが動いた時、対象のクラスを動作させるための連結(Change to SomeView) 15 16 func selectRd(rd reader:Int){ 17 18 switch reader { 19 case 2: 20 someView.label.text = "なんじゃこりゃ" //➡️変更を加える 21 case 3: 22 someView.label.text = "解決したー" //➡️変更を加える 23 default: 24 break 25 } 26 } 27 28} 29 30 31 32@objc protocol Change { 33 func selectRd(rd reader:Int) //➡️プロトコルに引数入りのfuncを書く(Changeの命令を書く) 34} 35 36class Another{ 37 var delegate: Change! //➡️Changeに対するデリゲート(Changeからの命令待機) 38 39 //これはただのxibインスタンス。ただの部品。任意。 40 class func instance() -> Another { 41 return UINib(nibName: "Another", bundle: nil).instantiate(withOwner: self, options: nil)[0] as! Another 42 } 43 44 @objc func buttonTapped(sender : AnyObject) { //ボタンタップ時に発動 45 46 let sIn:Int! //Int型の何かしらの値。任意。 47 48 self.delegate.selectRd(rd: sIn!) // ➡️命令発動!!! 49 } 50} 51 52class SomeView{ 53 var delegate: Change! //➡️Changeに対するデリゲート(Changeからの命令待機) 54 55 @IBOutlet weak var label: UILabel! //ここの値を変更したい!!!!!! 56 57 //これはただのxibインスタンス。ただの部品。任意。 58 class func instance() -> SomeView { 59 return UINib(nibName: "SomeView", bundle: nil).instantiate(withOwner: self, options: nil)[0] as! SomeView 60 } 61 62}

投稿2018/02/07 03:37

soujomitsuura

総合スコア24

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問