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

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

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

Delegatesとは、オブジェクト指向型プログラミングにおいて、あるオブジェクトの操作を一部の他のオブジェクトに代替させる手法のこと。オブジェクトは他のデリゲートに頼って関数を実行することができます。

Xcode

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

Swift

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

Q&A

0回答

840閲覧

【swift】Delegateがnilになってしまう

suzuki-0

総合スコア0

Delegates

Delegatesとは、オブジェクト指向型プログラミングにおいて、あるオブジェクトの操作を一部の他のオブジェクトに代替させる手法のこと。オブジェクトは他のデリゲートに頼って関数を実行することができます。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/09/10 08:11

編集2021/09/11 01:21

お世話になります
Delegateをnilチェックするときにnilになってしまい実行できません。
処理自体は、AビューにあるcollectionCellをタップするとタップしたcellの中にあるImageをBビューのImageViewに設定する感じです。

プロトコル

Swift

1protocol testProtocol{ 2 3 func change() 4 5}

Aビュー(処理を任せる側)

swift

1import UIKit 2 3class choiseIconsViewController: UIViewController{ 4 5 private let cellId = "cellId" 6 7 var delegate:testProtocol? = nil 8 9 //画像の名前 10 let icons = ["tb01","tb02","tb03","tb04","tb05","tb06","tb07","tb08","tb09","tb10","tb11","tb12","tb13","tb14","tb15","tb16","tb17","pr01","pr02","pr03","pr04","pr05","pr06","pr07","pr08","pr09","pr10","pr11","pr12","pr13","pr14","pr15"] 11 12 @IBOutlet weak var iconsCollection: UICollectionView! 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 17 iconsCollection.delegate = self 18 iconsCollection.dataSource = self 19 20     let backButtonItem = UIBarButtonItem(title: "戻る", style: .plain, target: self, action: #selector(tappedBack)) 21 self.navigationItem.leftBarButtonItem = backButtonItem 22 23//戻るボタンを押した時の処理 24    @objc func tappedBack() { 25    self.dismiss(animated: false, completion: nil) 26    let transition = CATransition() 27 transition.duration = 0.25 28 transition.type = CATransitionType.push 29 transition.subtype = CATransitionSubtype.fromLeft 30 self.view.window!.layer.add(transition, forKey: kCATransition) 31 } 32 } 33 34 let appDlegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate 35 36} 37 38extension choiseIconsViewController: UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout { 39 40 //cellが押された時の処理 41 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 42 43 print("セルが押されました") 44 if let dg = delegate { 45 dg.change() 46 }else{ 47 print("nilチェックに失敗しました") //毎回こっちが実行される 48 49 } 50 51 self.dismiss(animated: false, completion: nil) 52 53 } 54 55 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 56 57 let cell:UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) 58 59 let imageView = cell.contentView.viewWithTag(1) as! UIImageView 60 61 let cellImage = UIImage(named: icons[indexPath.row])//各セルにiconsの画像を反映 62 let resizedImage = cellImage?.resized(withPercentage: 0.05)//画像のデータサイズを縮小 63 imageView.image = resizedImage 64 65 appDlegate.iconImage = imageView.image 66 67 return cell 68 } 69     〜省略(cellの設定)

Bビュー(処理を任せられる側)

Swift

1import UIKit 2 3class addMaterialViewController:UIViewController,testProtocol{ 4 5 let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate 6 7 @IBOutlet weak var addImageStackView: UIStackView! 8 @IBOutlet weak var addMaterialImageView: UIImageView! 9 @IBOutlet weak var materialName: UITextField! 10 @IBAction func tappedMaterialName(_ sender: Any) { 11 12 } 13 14 @IBOutlet weak var addCategory: UIStackView! 15 16 override func viewDidLoad() { 17 18 super.viewDidLoad() 19 20 materialName.delegate = self 21 22 //stackViewがタップされた時に処理を実行 23 let tapGestrureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tappedStackView)) 24 self.addImageStackView.addGestureRecognizer(tapGestrureRecognizer) 25 26 addMaterialImageView.image = appDelegate.iconImage 27 28 //コード追加 29 let choiseIconsVC = choiseIconsViewController() 30 choiseIconsVC.delegate = self 31 32 } 33 34 func change() { 35 print("success") 36 addMaterialImageView.image = appDelegate.iconImage 37 } 38 39    〜省略〜 40

環境

Xcode Version 12.5.1

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

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

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

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

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

hoshi-takanori

2021/09/10 08:29

choiseIconsViewController の delegate にはどこで値をセットしてるのでしょうか? あと、気づいた点ですが、 ・choiseIconsViewController や addMaterialViewController などのクラス名の先頭は大文字にしましょう。 ・delegate は weak 宣言しないと retain cycle になってメモリーリークの元です。 ・appDelegate を使って情報を受け渡すのはどうかと思います。
suzuki-0

2021/09/10 08:40 編集

「choiseIconsViewController の delegate にはどこで値をセットしてるのでしょうか?」とはどういう意味ですか? 初心者ですみません。
hoshi-takanori

2021/09/10 08:58

例えば addMaterialViewController の viewDidLoad メソッドでは materialName.delegate = self としていますが、これは materialName という UITextField オブジェクトの delegate に自分自身をセットしています。 同様に、choiseIconsViewController オブジェクトの delegate にどこかで値をセットする必要があります。
suzuki-0

2021/09/10 11:02

設定していませんでした。 具体的にどうすれば良いのでしょうか?
hoshi-takanori

2021/09/10 11:09

普通は画面遷移する時に設定しますが、質問文のコードでは画面遷移するところが見当たらないですね…。
suzuki-0

2021/09/11 00:49 編集

choiseIconsViewControllerのコードに省略していた部分を追加してみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問