1

부모보기 컨트롤러에 자식보기 컨트롤러가 두 개 있습니다. 세그먼트 컨트롤의 값 변경시이를 호출하고 자식보기 컨트롤러를 통해 부모 imageView의 값을 설정하려고합니다.분할 된 제어 작업을 사용하여 하위보기 컨트롤러 호출?

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

이를 확인하시기 바랍니다. @ 백 슬래시 -f –

+0

어떤 문제가 있습니까? –

+0

세그먼트 컨트롤 컨트롤에 자식보기 컨트롤러를 표시하는 동안 문제가 발생했습니다. @ ParthoBiswas –

답변

1

UPDATE

아래 코멘트에 우리의 토론을 반영하기 위해, 나는 당신이 정말로 사용자 정의 컨트롤 (편집/필터)를 관리 할 수 ​​ContainersView Controllers 필요하다고 생각하지 않습니다. 과잉이야.

대신 custom Views을 작성한 다음 주 Storyboard에 추가해야한다고 생각합니다.

CustomEditView.valueY = newValueY 
CustomFiltersView.valueX = newValueX 

에 관한 :

내가 호출 할 필요가

그럼 당신은 단순히 사용자가 예를 들어, 그들에게 값을 전달뿐만 아니라 Segmented Control에 탭하면 사용자 정의보기를 표시/숨기기 수 강제로 segmentedControl 액션을 통해 childView의 my 값을 업데이트하십시오.

타겟 View Controllers을 로컬 변수에 매핑하고 사용자가 세그먼트를 누를 때 View Controller variables 타겟을 업데이트해야합니다.

나는 그것을 반영하기 위해 나의 대답에서 코드와 "데모"를 업데이트했다.
(난 그냥 labels에 임의 Strings을 가하고있어주의 점을 확인합니다.)

을 이제 완전한 답변에 ...


는 설정에서 당신은 Storyboard에서 View Controllers 이미있다, containers을 기반으로 in your other question을 설명했다. 다시 발표 할 필요는 없습니다 ( 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 (의 조치에 연결하지 않은 것은의 왼쪽에있는 원입니다 @IBAction이 채워져 있습니까?)

전화가 걸려 오면 segue 이름이 올바른지 확인하십시오. 또한 "FilterIAm"을 원하는 것처럼 보이기 때문에 segue 이름을 else로 수정하십시오.

그런 다음 중단 점을 prepareForSegue:...에 입력하십시오. 그렇지 않은 경우 이름이 IB와 동일한 지 다시 확인하십시오.

편집 :

귀하의 prepareForSegue 코멘트

에 따라이의 ViewController를 만들 생각하지 않습니다. 대상 뷰 컨트롤러는 segue를 수행 한 결과로 생성되어이 함수로 전달됩니다.

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

아무 것도 제시 할 필요가 없습니다. destinationViewController가 표시됩니다. 당신은 (당신이 가지고있는) 그것의 변수를 설정할 수 있습니다 - 그것은 segue를 준비함으로써 의미합니다.

+0

당신은 prepareforsegue 함수를 확인하시기 바랍니다, 그 오류가 그 함수에 있다고 생각해, 나는 childviewController를 제시하고 그것에 가치를 전달하고 싶다. 맞습니까? @LouFranco –