2011-08-05 4 views
0

사용자 지정 응용 프로그램 대리자를 해결하는 데 약 6 시간이 걸렸습니다. 자습서를 따라해도 오류가 발생합니다!iPhone 대표자와 인스턴스화 된 객체 두 개가 서로 이야기하기

한 개체가 다른 개체와 이야기하는 간단한 방법이 필요합니다.

나는 루트보기가 있습니다. 다른보기가 다음 옵션 목록과 스택에 푸시합니다. 이전 선택을 기반으로 관련 옵션을 보여주는 또 다른보기.

그래서 기본적으로 3 개의보기가 필요하며,보기 3을 사용하여 볼 때 1의 데이터를 다시 볼 필요가 있습니다. popBackToRootViewController .... 이것은 이론상 너무 단순해야하는 큰 두통이되고 있습니다. 이전에 nsuserdefaults에 데이터를 던졌지 만 애플이 제안하는 방식으로 프로토콜을 사용했습니다.

누군가가 나 당신이 공식 규칙을 따르지 않는 경우에도 작동하는 개념을 공식화 :

답변

0

프로토콜대표을 이해하는 데 도움이 될 수하십시오 : 그것은 객체가 각 이야기 할 수있는 방법을 선언 관하여 특히 당신이 객체 중 하나에 대한 통제권을 갖고 있지 않거나 원하지 않는 경우, 또는 상황이 복잡해지고 모든 것이 멋지고 깔끔해지기를 원할 때 코드를 재사용하기가 더 쉬운 경우 .

그런데 꽤 작고 잘 알려진 정보 세트가 재사용 될 가능성이없는 두 개 (이상)의 잘 알려진 객체 사이에서 앞뒤로 전달되는 경우, 비공식 성은 꽤 괜찮습니다.

  • 가 정보를 취할 것 객체를 수신 구현 의 유형의 속성 수신 객체
  • 으로 의 방법을 전송 객체를 제공합니다

    이 당신이 할 수 의미 예를 들어, 루트 컨트롤러가 자식을 푸시 할 때 어떤 경우에

  • 으로 전송 될 객체는 수신 목적은 값 전송 객체 자체를 설정할 것이다 전송 객체 전송에 대한 정보를 갖는 경우, 그것을 요구하는 메시지를 보낼 개체 수신 참조를 사용
  • 앞에서 언급했듯이 정보를 인수로 전달합니다.

앞에서 언급했듯이 이것은 글루 코드에 의미가 있습니다. 당신이 팀에서 작업하는

  • 당신은 하나의 객체에 최선을 다하고과 팀원은 다른
  • 에 노력하고 있습니다 당신이 할 수 그것은 분명하다 : 경우,하지만 이런 식으로 일을해서는 안 향후 프로젝트에서 동일한 기능을 사용할 수 있습니다.이 경우 원래 수퍼 클래스와 응용 프로그램 별 하위 클래스 사이에 중간 하위 클래스가 있어야합니다. 하위 클래스는 핵심 기능을 캡슐화하고 이에 대한 인터페이스를 제공하는 공식 프로토콜을 제공합니다.
  • 정보 교환은 같은 응용 프로그램
  • 정보 자체의 교환은 접착제의 방법은 그것에게 그 문제를 해결하기
+0

고마워요.하지만 벽돌 벽에 머리를 두드리는 중입니다. 알아 두어야 할 것은 클래스에서 프로토콜을 선언하거나 데이터를 보내는 곳입니다. 클래스 위임을 self가 아닌 다른 것으로 설정하는 방법에 대해 설명합니다. – MrPink

+0

그게 다릅니다 - 프로토콜은 데이터 흐름을 양방향으로 허용합니다. 프로토콜을 제공하는 클래스의 각 개체는 대리자를 호출하여 정보를 보내지 만 폴링에도이 정보를 사용할 수 있습니다. 캡슐화가 더 의미있는 클래스에 프로토콜을 넣을 것입니다. 프로토콜을 구현하는 클래스도 위임자의 속성이 필요합니다. 위임자를 설정하는 방법은 개발자가 결정합니다. 아웃렛을 아웃 바운드로 설정하는 경우 인터페이스 작성기에서도 할당 할 수 있습니다. 그렇지 않으면 정보를 교환하기 전에 프로그래밍 방식으로 설정해야합니다. – Toastor

1

이 다른 방법을 포함하지 않을 다소 복잡 하나 (또는 ​​2). 무엇보다 먼저 변경 사항을 적용한 뷰에 첫 번째 뷰를 계속 전달한 다음 뷰 1 메서드를 호출 할 수 있습니다. 필자는이를 권장하지 않습니다. 또 다른 훨씬 쉬운 방법은 Notifications을 사용하는 것입니다. 알림 센터 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(somethingChanged) name:@"aStringWichIsUniqeForCallingSomethingChanged" object:nil];에 첫 번째보기를 등록하면됩니다. 콜백 메소드를 제공하고 구현해야한다 (내 경우에는 somethingChanged). 상황이 발생한 하위보기에서 [[NSNotificationCenter defaultCenter] postNotificationName:@"aStringWichIsUniqeForCallingSomethingChanged" object:nil];을 통해 알림을 게시해야합니다. 더 이상 필요하지 않은 경우 알림 센터에서보기를 제거하는 것을 잊지 마십시오! [[NSNotificationCenter defaultCenter] removeObserver:self]; 세 번째 가능성은 통신해야하는 모든보기가 포함 된 singelton (앱 대리자와 같은)을 사용하는 것입니다. Simple은 모든 뷰를이 singleton에있는 그들을위한 ivars & 속성으로 만들고, 각각이 변할 때 호출되어야하는 메소드를 구현합니다. 그런 다음 [[singelton sharedInstance] view1] somethingChanged]으로 전화하십시오.

내가보기라고하면 viewController를 의미하지만 글을 쓰려면 게으름입니다. ;) 희망, 그게 도움이!

관련 문제