2010-01-14 2 views
5

마지막 질문 (superview and parentviewcontroller nil after adding a subview)에서 새 질문을 열어 두겠습니다. 기본적으로 나는 하위 뷰를 사용하는 것이 좋은 생각이지만 다른 ViewController 내부에있는 서브 뷰를 제어하는 ​​ViewController를 가져서는 안된다. 기본적으로 다음을하고 싶습니다 ... 공통 서브 뷰를 공유하는 두 개의 ViewController가 있습니다. SearchDate.xib라는 펜촉으로 서브 뷰를 만들었습니다. 파일 소유자는 해당 클래스 SearchDateView.m/h입니다. 그 클래스에는 레이블 인 펜촉의 UIView 안에 유일한 요소에 대한 콘센트가 있습니다. SearchDateView 클래스에는 SearchDateView.xib의 레이블 값을 변경하는 함수도 있습니다. 두 ViewControllers 모두이 펜촉을로드하고 싶지만 펜촉을 제대로로드하는 방법을 알지 못합니다. 아무리 최선을 다해도 아무 것도 표시되지 않고 최악의 경우 예외가 발생합니다. Apple docs는 IB의 다른 클래스의 인스턴스에서 기본보기로 드래그하는 것에 대해 이야기하지만 이는 제대로 작동하지 않는 것 같습니다. 나는 나의의 ViewController에서 SearchDateView 콘센트를하고 난 컨트롤러의로드 뷰에이 일을 시도 :여러 ViewControllers에서 사용할 수있는 연관된보기 클래스가있는 펜촉을 만들 수있는 방법

searchDateView = [[[NSBundle mainBundle] loadNibNamed:@"SearchDateView" owner:self options:nil] objectAtIndex:0]; 
[[self view] addSubview:searchDateView]; 

그러나 나는이 예외 얻을 :

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainViewController 0x431fac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchDateLabel.' 

내가 완전히 뭔가 잘못하지만 무엇을하고있어 알을 펜촉, 펜촉에있는 객체 중 일부를 업데이트하는 연관된 뷰 클래스를 가지고 올바른 펜촉을 사용하고 다른 펜촉에서 펜촉을 재사용 할 수 있습니까?

편집 : 의견을 감안할 때 아마도 충분하지 않았을 것입니다. 나는 전체보기에 대해 동일한 nib 파일을 사용하고 싶지 않습니다. 오히려 하위보기입니다. 예를 들어 컨트롤러 A에는 맵과 SearchDateView가 있고 컨트롤러 B에는 테이블 뷰와 SearchDateView가 있습니다. 그래서 여러 컨트롤러에 서브 뷰를로드하는 방법을 궁금 해서요 ...

답변

2

각 컨트롤러가 initWithNibName : bundle :을 사용하여 초기화 될 때 동일한 컨트롤러 파일에 대해 아무런 문제가 없어야합니다. 컨트롤러 내에서 컨트롤러 자신의 nib 파일을로드하지는 않습니다.

loadNibNamed :::를 사용하여 nib 파일을로드하는 경우 객체가 정의 된 NSArray가 표시되므로 뷰로 직접 사용할 수 없습니다. 보기를 얻는 한 가지 방법은 for() 또는 원하는 객체를 찾기 위해 무언가를 사용하여 배열을 검색하는 것입니다. 그러나 owner : self를 설정하면 File 's Owner는 자기 자신으로 File Owner에 연결된 콘센트에 연결해야합니다 . 그러나이 경우 반환 값을 무시할 수 있습니다. 당신은 반환 된 배열이 필요하지 않습니다. 그 콘센트가 연결되어 있다면 그게 당신의 주요 문제 (배열과 콘센트를 clobbering) 수 있습니다.

loadNibNamed를 사용하여 특정 뷰 객체를로드 한 다음 (반환 된 배열에서 해당 객체를 가져온 것으로 가정하고) 어떻게 든 표시 할 수 있지만 일반적으로 컨트롤러에서 initWithNibName을 사용하는 것이 더 쉽습니다 (File Owner가 컨트롤러가되어야 함).

아, 인터페이스 작성기에서 컨트롤러의 nib 파일을 설정할 수도 있습니다. 기본적으로 인터페이스 빌더에게 nib 파일을 설정하여 initWithNibNamed와 같은 일을하도록 지시하기 때문에 여러 컨트롤러에 대해 동일한 펜촉을 사용하는 데 문제가 없어야합니다. 컨트롤러 개체를 클릭하고 속성 윈도우를 확인하십시오.

업데이트

아마 여러 컨트롤러에 하나 개의보기를 사용하기 위해이 작업을 수행 할 것 :

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FooView" 
               owner:self options:nil]; 
    for (id obj in nib) 
     if ([obj isKindOfClass:[FooView class]]) 
      myNewView = (FooView *)obj; 

(제 8 장에서 도난 : 처음부터 셀이 샘플 코드 iPhone 3 개발.

IB의 아울렛을 사용하여이 작업을 수행 할 수 있습니다.이 경우 for 루프를 생략 할 수 있지만 수퍼 클래스가 필요합니다. 콘센트를 선언하는 컨트롤러와 인터페이스 빌더에 File 's Owner가 그 수퍼 클래스의 인스턴스가되어 콘센트에 대해 알고 있다고 알려주는 것입니다. 아마도 문제의 가치가 없습니다.

+0

죄송하지만 어쩌면 내가 너무 명확하지 않았습니다. 나는 전체보기에 대해 동일한 nib 파일을 사용하고 싶지 않습니다. 오히려 하위보기입니다. 예를 들어 컨트롤러 A에는 맵과 SearchDateView가 있고 컨트롤러 B에는 테이블 뷰와 SearchDateView가 있습니다. 그래서 여러 컨트롤러에 하위 뷰를로드하는 방법을 궁금하네요. – deadroxy

+0

귀하의 상황에보다 구체적으로 답변을 올렸습니다. – Nimrod

+0

예. 수퍼 클래스가 내 문제의 유일한 "실제"해결책 인 것 같습니다. 아마도 나중에 리팩터링 할 것이지만 지금은 몇 가지 해결 방법을 찾았습니다. - 감사합니다! – deadroxy

0

나는 나의의 ViewController에서 SearchDateView 콘센트를하고 난 컨트롤러의로드 뷰에이 일을 시도 :

searchDateView = [[[NSBundle mainBundle] loadNibNamed:@"SearchDateView" owner:self options:nil] objectAtIndex:0]; 
[[self view] addSubview:searchDateView]; 

그러나 나는이 예외 얻을 :가없는 경우

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MainViewController 0x431fac0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key searchDateLabel.' 

을 Cocoa Bindings (코코아 터치에서만 사용 가능한 코코아에서만 사용 가능)의 두 가지가 관련이 있다고 생각하지 않습니다.

Xcode에서 objc_exception_throw에 기호식 중단 점을 추가 한 다음 디버거에서 앱을 실행하십시오. 끊어지면 호출 스택을 살펴보십시오. 문제가 실제로 발생한 곳을 찾을 수 있습니다.

관련 문제