2017-01-15 6 views
0

UINavigationController의 일부인 UIViewController이 있고 내 탐색 막대에 사용자 지정보기가 필요합니다. 다음 코드는이 같은 것입니다 :스위프트 : 단단히 결합 된 뷰를 처리하는 방법?

class MyViewController: UIViewController 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.customNavigationView = MyNavigationView() 
     self.navigationItem.titleView = self.customNavigationView 
    } 
} 

MyViewControllerMyNavigationView 단단히 의미에서 연결되어있다 - 그들은 UI의 한 조각을 형성하고 함께 사용하는 경우에만 의미가. 그런 경우를 처리하는 가장 좋은 방법이 패턴과 맞는지 궁금합니다. 특히, 메시지를 MyNavigationView에서 MyViewController (태핑 한 버튼 등)로 보내는 것이 더 좋습니다.

  • 는, 위임 패턴을 사용하십시오 MyNavigationViewDelegate 프로토콜을 만들고 MyNavigationViewdelegate 속성을 추가 :

    나는 다음과 같은 옵션을 보았다. 가장 객체 지향적 인 접근 방식이지만, 기본적으로 UI의 단일 단위 인 무언가에 대한 오버 헤드가 많습니다.
  • MyNavigationView의 내부 클래스가 강력한 관계를 나타 내기 위해 내부 클래스가되도록하십시오. . 괜찮아 보이지만 쉽게 탐색 할 수 있도록 클래스별로 파일을 갖고 싶습니다.
  • weak var myViewController: MyViewController?MyNavigationView에 사용하십시오. 의미 적으로 변수가 옵션이 아니어야한다고 생각하지 않습니다.
  • let myViewController: MyViewControllerMyNavigationView에 사용자 정의 이니셜 라이저를 설정합니다. 지금은 나에게 최고의 옵션 인 것처럼 보이지만 강력한 참조주기 이후로 메모리 누수가 발생할 수 있는지 확실하지 않습니다.
  • @Mohsen 호세 인 덕분에 : MyNavigationView에서 MyViewController으로 알림을 보냅니다.

다른 사람들의 생각이 궁금합니다. 여기에 사용해야하는 명확한 패턴이 있습니까? 아니면 맛의 문제입니까?

+0

왜 사용자의보기가 호스트에 대해 알 수 있습니까? 부모님과 어떤 정보를 공유하고 싶습니까? –

+0

정확히 그 점/질문입니다 : 일반적으로 볼 수는 없지만 두 사람이 너무 단단히 결합 된이 사건은 마치 저에게 마치 대리인 등을 두는 것보다 엄청난 오버 헤드가있는 것 같아요. 예를 들어, UI 이벤트 (버튼 누름 등)에 대한 메시지를 컨트롤러로 다시 보냅니다. – BlackWolf

+1

대신 버튼 자체를 드러내 기 때문에 뷰의 속성으로 사용합니다. 그리고보기를 초기화 한 후 viewcontroller에서 컨트롤러 자체에서 처리 할 제스처 인식기를 할당합니다.그런 식으로보기가 여전히 호스트에 대해 아무것도 알지 못합니다. –

답변

1

MVP 디자인 패턴에서 궁극적으로이 질문에 대한 답은 비즈니스 로직을 포함해서는 안되며 로직 만 표시하면됩니다. 그것은 그 호스트에 대해 아무것도 알지 못한다는 것을 의미합니다.

내가 접근하는 방법은 호스트에 연결 코드와 상호 작용 코드를 쓰는 것입니다.

class MyNavigationView : UIView 
{ 
    var button : UIButton! 

} 

class ViewController : UIViewController 
{ 
     override func viewDidLoad() { 
     super.viewDidLoad() 
     self.customNavigationView = MyNavigationView() 
     self.navigationItem.titleView = self.customNavigationView 
     // here you can assign gesture recognizers or add event listeners 

    } 
} 
0

알림을 사용하는 방법에 대한 자세한 설명이 필요하면 내보기를 편집 할 수 있고 다른보기에서 문제가 발생했는지 알아야 할 경우 알림을 사용합니다. 더 설명해주세요.

+0

확실히 내가 위에서 언급하지 않은 옵션입니다, 그리고 그것을 편집 할 것입니다. 나는 논쟁이 매우 낮은 결합을 가지고 있다고 논쟁 할 것입니다, 그것은 의미 론적으로 관점 들과는 정반대입니다. – BlackWolf