2017-12-23 27 views
0

각기 다른 사진 앨범을로드하는 PageViewController가 있습니다. 각 사진 앨범은 다른보기 컨트롤러 (album1ViewController ... album3ViewController)에서로드됩니다 (아래 그림 참조). Storyboard로드하는 ViewController의 Detail PageViewController에서 함수를 호출합니다.

각보기 컨트롤러 (album1 ... album3)는 탐색보기 컨트롤러에서로드되어 탐색 막대를로드합니다. 탐색 막대에 카메라 롤 단추를 추가하여이 코드를 ItemVC (이미지를로드하는 코드)에 넣고 PageViewController에서도 추가했지만 저장 버튼을 활성화하지 않았습니다.

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Save", style: .plain, target: self, action: #selector(saveToCameraRoll)) 

버튼을 프로그래밍 방식으로 추가하는 유일한 방법은 앨범 VC 안에있는 것이라고 생각했습니다. (ItemsVC의 스토리 보드에 막대를 추가하려고했지만 제대로 표시되지 않았습니다.) 하지만 이제는 ItemsViewController의 이미지로 앨범 # ViewController라는 버튼에 SaveToCameraRoll 함수를 호출하려고합니다. 내가 먼저 ItemsVC 안에 함수를 남겨두고 다음과 같이 앨범 VC에서 호출하려고 시도했습니다.

let vc = self.storyboard?.instantiateViewController(withIdentifier: "ItemController") as! ItemViewController 
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Guardar en Fotos", style: .plain, target: self, action: #selector(vc.saveToCameraRoll)) 

그러나 앱이 충돌합니다. 라인에서 I 오류와 충돌 얻을 ALGO 번째 경우

@objc func saveToCameraRoll() { 
    let vc = self.storyboard?.instantiateViewController(withIdentifier: "ItemController") as! ItemViewController 
    let imageData = UIImagePNGRepresentation(vc.contentImageView.image!) 
    let compresedImage = UIImage(data: imageData!) 
    UIImageWriteToSavedPhotosAlbum(compresedImage!, nil, nil, nil) 

} 

:

unrecognized selector sent to instance 0x7fca05d32e60

그럼 I이 같은 SaveToCameraRoll 기능을 추가 albumVC에서 시도 :

이 에러
let imageData = UIImagePNGRepresentation(vc.contentImageView.image!) 

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

이 기능을 추가 할 수있는 방법이 있습니까? 또는 이것을 보관하는 간단한 방법이 있습니까? 감사합니다.

답변

0

델리게이트 속성을 갖도록 앨범보기 컨트롤러를 설정하는 것이 좋습니다.

saveToAlbum 메소드를 구현하는 프로토콜 ParentProtocol을 정의하십시오.

ItemController을 해당 프로토콜에 따르게하십시오.

페이지보기 컨트롤러에서 페이지를로드 할 때 대리자 속성을 self로 설정하십시오.

앨범보기 컨트롤러에서 saveToAlbum 메서드를 대리자로 보내는 앨범보기 컨트롤러에서 IBAction 메서드를 만듭니다.

자식보기 컨트롤러에서 부모까지 메시지를 전달하는 데 매우 일반적인 패턴입니다.

나는 최근에 TabBarControllers이라고 불리는 프로젝트를 만들었습니다.이 프로젝트는 탭바 컨트롤러 (탭바 컨트롤러는 2 개 이상의 자식 뷰 컨트롤러를 탭으로 관리합니다.)와 매우 유사한 기능을 수행합니다.이 경우 하위 뷰 컨트롤러는 스토리 보드에서로드됩니다 시작시에 segue를 통해. 위의 경우 앨범보기 컨트롤러를로드 할 때 대리자를 설정하는 코드를 작성해야하지만 아이디어는 매우 비슷합니다.