0

私は現在、コンテナビューを使用していると私は、デリゲートを使用して、子ビューコントローラを介して親ビューコントローラImageViewのの値を変更したいが、それは常にnilを返します。iOS - 子コンテナを介して親ビューコントローラのイメージビューを設定するにはどうすればよいですか?

import UIKit 

protocol updateImage { 
    func userIsDone(image:UIImage) 
} 

class ViewController: UIViewController, updateImage{ 

    @IBOutlet weak var imageView:UIImageView! 
    var image = UIImage(named: "hello.png") 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.imageView.image=self.image 
    } 

    func userIsDone(image: UIImage) { 
     self.image=image 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "containerChild"{ 

      let nextView = segue.destinationViewController as! ControllerChild 
      nextView.image=self.image 
      nextView.delegate=self 
     } 
    } 
} 

class ControllerChild:UIViewController{ 

    var image=UIImage(named: "newhello.png") 
    var delegate: updateImage? = nil 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func changeImage(sender:UIButton){ 

     if(delegate != nil){ 
      self.delegate!.userIsDone(self.image!) 
      print("I am Called!") 
     } 
    } 
} 
+0

ではなく、コードの画像を投稿し、あなたの質問で実際のコードを投稿してください。 – Fahim

+0

がコードを掲載しました。 @Fahim –

+0

ありがとうございました:)今見てみましょう。私は答えがあれば投稿します。 – Fahim

答えて

0

この行削除:

nextView.image = image 

をまたにuserIsDone機能を変更します。

サイドノートとして
func userIsDone(image: UIImage) { 
    imageView.image = image 
} 

hello

  • Swiftではブロック/クロージャの外側にselfを使用する必要はありません。たとえば、self.imageView.image = self.imageは必要ありません。ちょうどimageView.image = imageとなります。
  • プロトコルは、UpdateImageupdateImageではなく)のように大文字で入力する必要があります。
  • 画像を参照するには、.pngを追加する必要はありません。タイトルのみです(例:"hello")。

Appleは、awesome Swift bookのスウィフトコード規約を記述しています。ここで

コード、リファクタリング(スウィフト3)である。

import UIKit 

protocol UpdateImageProtocol { 
    func userIsDone(image: UIImage) 
} 

class ViewController: UIViewController, UpdateImageProtocol { 

    @IBOutlet weak var imageView: UIImageView! 
    var image = UIImage(named: "hello") 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     userIsDone(image: image!) 
    } 

    func userIsDone(image: UIImage) { 
     imageView.image = image 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "containerChild" { 
      let nextView = segue.destination as! ChildViewController 
      nextView.delegate = self 
     } 
    } 
} 

class ChildViewController: UIViewController { 

    var image = UIImage(named: "newHello") 
    var delegate: UpdateImageProtocol? 

    @IBAction func changeImage(sender: UIButton) { 
     delegate?.userIsDone(image: image!) 
    } 
} 
+0

これで問題が解決してくれてありがとうございます。セグメント化されたアクションでコンテナビューコントローラを変更する方法を教えてください。 @ backslash-f –

+0

問題ありません。私はあなたの質問を理解しているかどうかわからない...あなたが達成したいと思うものは何ですか? (私はより詳細な別の質問を作成することをお勧めします、物事はこれらのコメントフィールドで混乱することがあります)。 –

関連する問題