1

親ビューコントローラに2つの子ビューコントローラがあり、セグメント化されたコントロールの値が変更されたときにそれらを呼び出す必要があり、子ビューコントローラを通じて親イメージビューの値を設定する必要があります。セグメント化されたコントロールアクションを使用して子ビューコントローラを呼び出すか?

protocol UserEdittedPhoto { 
    func UserIsDone(image:UIImage) 
} 

class ControllerFinal:UIViewController, UserEdittedPhoto{ 

    func UserIsDone(imageEditted: UIImage){ 
     self.usedImage=imageEditted 
     self.imageView.image=self.usedImage 
    } 

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

    @IBAction func segmentAction(sender:UISegmentedControl){ 

     if (segmentedControl.selectedSegmentIndex==0){ 

      performSegueWithIdentifier("EditIAm", sender: nil) 
     } 

     else if (segmentedControl.selectedSegmentIndex==1){ 

      performSegueWithIdentifier("EditIAm", sender: nil) 
     } 
    } 

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

     if segue.identifier == "EditIAm"{ 

      let storyboard = UIStoryboard(name: "Main", bundle: nil) 
      let controller = storyboard.instantiateViewControllerWithIdentifier("ControllerEdit") 
      self.presentViewController(controller, animated: true, completion: nil) 

      let nextView = segue.destinationViewController as! ControllerEdit 
      nextView.originalImage=self.imageView.image! 
      nextView.delegate=self 
     } 

     else if segue.identifier == "FilterIAm"{ 

      let storyboard = UIStoryboard(name: "Main", bundle: nil) 
      let controller = storyboard.instantiateViewControllerWithIdentifier("ControllerFilters") 
      self.presentViewController(controller, animated: true, completion: nil) 

      let nextView = segue.destinationViewController as! ControllerFilters 
      nextView.toBeFilter=self.imageView.image! 
     } 
    } 

    class ControllerEdit:UIViewController{ 
     var delegate: UserEdittedPhoto? = nil 
     if (delegate != nil){ 
     self.originalImage = UIImage(CIImage: CIImage(image: self.originalImage)!.exposureAdjustFilter(sliderValue.value)!) 
     self.delegate!.UserIsDone(self.originalImage) 
     print("I am Called!") 
     } 
    } 

    class ControllerFilters:UIViewController{ 
     override func viewDidLoad() { 
      print("SAHASHhqdwiuhiuhsaiuhsaiudhiuash") 
      controllerFinal?.imageView.image=toBeFilter 
      print("SAHASHhqdwiuhiuhsaiuhsaiudhiuash") 
      super.viewDidLoad() 
     } 
} 
+0

これをチェックしてください。 @ backslash-f –

+0

あなたはどんな問題に直面していますか? –

+0

セグメント化されたコントロールアクションで子ビューコントローラを表示しているときに問題が発生しています。 @ParthoBiswas –

答えて

1

UPDATE

以下のコメントで私たちの議論を反映させるために、私はあなたが本当にあなたのカスタムコントロール(編集/フィルタ)を管理するためのContainersView Controllersを必要としないと思います。それは過労です。

代わりにcustom Viewsを作成してから、メインのStoryboardに追加する必要があります。

ユーザーは例えば、それらに値を渡すだけでなく、Segmented Controlをタップしたときに、あなたは単にあなたのカスタムビューを表示/非表示ができます

CustomEditView.valueY = newValueY 
CustomFiltersView.valueX = newValueX 

について:

私が呼び出す必要がありますそれは強制的にsegmentedControlアクションを通して、 私のchildViewの私の値は更新されます

ターゲットView Controllersをローカル変数にマップして、ユーザーがセグメントを押したときにターゲットView Controller variablesを更新する必要があります。

これを反映させるために私はコードと "demo"を更新しました。

を今すぐ完全な答えに(私はポイントを作るためにlabelsにランダムStringsを入れていること。注意してください)...containersに基づいていますがin your other questionを説明し、セットアップでは、


View ControllersStoryboardで、すでにそこにあります。あなたは絶対にそれらを再度提示する必要はありません(performSegueWithIdentifierの呼び出しを削除することができます)。

私が正しく理解している場合は、ユーザーがSegmented Controlで選択した内容に基づいて、異なる「コントローラ」を表示する必要があります。

はそれを行うためのいくつかの方法がありますが、一番簡単なの一つは非表示にするとControllerEdit/ControllerFiltersView Controllerscontainersを示すことだろう - containersisHidden変数の状態を変更すること。このよう

demo

Storyboardセットアップ:(my other answerに基づく)

storyboard

コード:

import UIKit 

protocol UpdateImageProtocol { 
    func userIsDone(image: UIImage) 
} 

class ViewController: UIViewController, UpdateImageProtocol { 

    @IBOutlet weak var imageView: UIImageView! 

    @IBOutlet weak var changeImageContainer: UIView! 
    var controllerEdit: ControllerEdit? 

    @IBOutlet weak var applyFilterContainer: UIView! 
    var controllerFilters: ControllerFilters? 

    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 == "controllerEdit" { 
      let nextView = segue.destination as! ControllerEdit 
      nextView.delegate = self 
      controllerEdit = nextView 

     } else if segue.identifier == "controllerFilters" { 
      let nextView = segue.destination as! ControllerFilters 
      controllerFilters = nextView 
     } 
    } 

    @IBAction func segmentAction(_ sender: UISegmentedControl) { 
     if sender.selectedSegmentIndex == 0 { 
      changeImageContainer.isHidden = false 
      applyFilterContainer.isHidden = true 

      controllerEdit?.customLabel.text = String(arc4random_uniform(999)) 

     } else { 
      changeImageContainer.isHidden = true 
      applyFilterContainer.isHidden = false 

      controllerFilters?.customLabel.text = String(arc4random_uniform(999)) 
     } 
    } 
} 

class ControllerEdit: UIViewController { 

    @IBOutlet weak var customLabel: UILabel! 

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

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

class ControllerFilters: UIViewController { 

    @IBOutlet weak var customLabel: UILabel! 

    // TODO 
} 
+0

私はview1のピクチャとview2のいくつかのフィルタに対して基本的な編集を行っていますが、それは子ビューを表示したり非表示にするのに適していますか? @ backslash-f –

+0

セグメント化されたコントロールを押すたびにsegueからchildviewControllerに更新された値を渡す必要がありますが、開始時に一度だけ呼び出され、それ自体が表示され、非表示になります。 @ backslah-f –

+0

これはうまくいくかもしれませんが、個人的にはアーキテクチャの観点からは非常に良いアプローチではないと思います。カスタムコントローラーを処理するにはView Controllerが本当に必要ではないようです。それは過労です。カスタムビューを作成し、これらのカスタムビューを簡単に表示/非表示する方が良いでしょう。私はそれについてのチュートリアルを書いた:http://stackoverflow.com/documentation/ios/1362/custom-uiviews-from-xib-files#t=201703252136398973902、見てみましょう。私はこの情報で私の答えを更新します。 –

1

この機能にブレークポイントを置く:

@IBAction func segmentAction(sender:UISegmentedControl){ 

    if (segmentedControl.selectedSegmentIndex==0){ 

     performSegueWithIdentifier("EditIAm", sender: nil) 
    } 

    else if (segmentedControl.selectedSegmentIndex==1){ 

     performSegueWithIdentifier("EditIAm", sender: nil) 
    } 
} 

が呼び出さなっていない場合、あなたはおそらくインクルードの左側の円である(IBでアクションに接続していませんでしたあなたが "FilterIAm"を望んでいるように見えるので、もしelseがあれば、それを修正してください。

次に、prepareForSegue:...にブレークポイントを設定します。そうでない場合は、IBと同じ名前を再確認してください。

EDIT:あなたのprepareForSegueはViewControllerをを作成することになっていませんコメント

に基づきます。デスティネーションビューコントローラは、セグを実行した結果として作成され、この関数に渡されます。

if segue.identifier == "EditIAm"{ 
    let nextView = segue.destinationViewController as! ControllerEdit 
    nextView.originalImage=self.imageView.image! 
    nextView.delegate=self 
} 

あなたは何も提示する必要はありません - destinationViewControllerが表示されます。その変数のいずれかを設定することができます(あなたが持っているように)、それはセグの準備を意味します。

+0

あなたはprepareforsegue関数を確認してください、私はエラーがその関数にあると思います、私はchildviewControllerを提示し、それに値を渡したいと思います。それが正しいか? @LouFranco –

関連する問題