お世話になります
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
choiseIconsViewController の delegate にはどこで値をセットしてるのでしょうか?
あと、気づいた点ですが、
・choiseIconsViewController や addMaterialViewController などのクラス名の先頭は大文字にしましょう。
・delegate は weak 宣言しないと retain cycle になってメモリーリークの元です。
・appDelegate を使って情報を受け渡すのはどうかと思います。
「choiseIconsViewController の delegate にはどこで値をセットしてるのでしょうか?」とはどういう意味ですか?
初心者ですみません。
例えば addMaterialViewController の viewDidLoad メソッドでは materialName.delegate = self としていますが、これは materialName という UITextField オブジェクトの delegate に自分自身をセットしています。
同様に、choiseIconsViewController オブジェクトの delegate にどこかで値をセットする必要があります。
設定していませんでした。
具体的にどうすれば良いのでしょうか?
普通は画面遷移する時に設定しますが、質問文のコードでは画面遷移するところが見当たらないですね…。
choiseIconsViewControllerのコードに省略していた部分を追加してみました。
あなたの回答
tips
プレビュー