initwithnibname : 번들로 만든 uiviewcontroller : 또는 iboutlet을 통해 다르게 행동합니다.

StackOverflow https://stackoverflow.com/questions/2257124

문제

나는 이상한 행동을 발견했고, 내가 어떤 주장이 잘못되었는지 설명하고 싶습니다.

새로 생성 된 창 기반 프로젝트의 AppDelegate 클래스에서 UiviewController를 창에 추가하고 있습니다.
나는 그것을 두 가지 다른 방법으로 할 수 있습니다.
- Iboutlet과 함께. IB에서는 단순히 UIViewController를 인수하고 클래스를 TestViewController로 설정하여 연결 (코드의 시나리오 A)을 연결했습니다.
- 코드 (시나리오 B)로 UIViewController 작성.

    - (void)applicationDidFinishLaunching:(UIApplication *)application {    

#define USE_IBOUTLET YES // Comment this line to switch to scenario B

#ifdef USE_IBOUTLET
    // Scenario A

    [window addSubview:theTestViewController.view];
    [window makeKeyAndVisible];
#endif


#ifndef USE_IBOUTLET
    // Scenario B

    TestViewController *theTestViewControllerProgrammatically;

    theTestViewControllerProgrammatically = [[TestViewController alloc] initWithNibName:nil bundle:nil];

    // According to Apple: "It is a good idea to set the view's frame before adding it to a window.", so let's do it
    [theTestViewControllerProgrammatically.view setFrame:[[UIScreen mainScreen] applicationFrame]];

    [window addSubview:theTestViewControllerProgrammatically.view];

    [window makeKeyAndVisible];
#endif
}

IB에서 객체를 사용자 정의하지 않았으므로 두 시나리오에서 동일한 동작이 있어야합니다.

iBoutlet을 사용하는 시나리오 A는 예상대로 작동합니다.
그러나 시나리오 B에는 다음과 같은 문제가 있습니다.
- 뷰는 올바른 위치에 있지 않습니다 (20 픽셀에서 높이에서 상태 표시 줄로 덮여 있음).
-보기는 제대로 크기를 조정하지 않습니다 (예 : in in in all status bar를 전환하십시오).

왜요?

문제를 재현하려면 여기 프로젝트의 zip 아카이브 : http://dl.dropbox.com/u/1899122/code/protowindowbasedstrangeness.zip

도움이 되었습니까?

해결책

이것은 내 긴 답변 후에는 정말 어리석은 소리가 들리지만, 당신이 가진 문제는 (프로그래밍적으로) 고치는 것이 간단합니다.

이 라인 :

[theTestViewController.view setFrame:[[UIScreen mainScreen] applicationFrame]];

실제로는 다음과 같아야어야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야해야한다.

[theTestViewControllerProgrammaticaly setFrame:[[UIScreen mainScreen] applicationFrame]];

프로그래밍 방식으로 만든 것이 아니라 IB가 설정 한 VC의 프레임을 설정했습니다.

어쨌든 - 내 모든 의견이 여전히 적용된다는 것은 주목할 가치가 있습니다! IB의 컨트롤러 개체를 사용하지 않으면 프로그래밍 방식으로 수행해야 할 몇 가지가 여전히 있습니다 (예 : 탐색 표시 줄 항목 설정)

다른 팁

VC 객체가 모두 동등하게 생성 된 것은 아니라는 점에서 나는 당신과 매우 비슷한 문제를 겪고 있습니다! 내가 가진 문제는 탐색 막대 항목을 설정하는 것입니다. 파일의 소유자가 프로그래밍 방식으로 인스턴스화하는 뷰 컨트롤러 개체 일 때는 할 수없는 것 같습니다. IB의 컨트롤러 객체를 풀지 않은 경우에만 작동합니다.

나는 당신의 프로젝트를 다운로드하고 그것을 가지고 놀았으며, 무슨 일이 일어나고 있는지에 대해 더 생각하게되었습니다. 합리적인 답변을 제공 할 수 있다고 생각하지만 간단한 해결책이 있는지 확실하지 않습니다 ...

내가 생각하는 것은 Apple이 IB 에서이 컨트롤러 객체를 약간 더 특화된 것으로 만들었다는 것입니다. 이것이 사실 일 수있는 한 가지 제안은 IB VC 객체에 내가 볼 수있는 UIViewController 클래스에 직접 해당 속성이없는 속성을 가지고 있으므로 IB의 컨트롤러 객체에는 비 UViewController 하위 클래스가 할 수없는 추가 기능이있을 수 있습니다. 활용하십시오. .xib의 객체가 완전한 '동결 건조 된'객체라는 점을 감안할 때 Apple은 IB 버전에서 볼 수 없거나 사용할 수없는 모든 종류의 개인 속성을 포함했을 수 있습니다. .

예를 들어, 당신의 MainWindow.xib, IB VC 객체를 선택하면 "NIB에서보기 크기 조절"과 같은 검사관 팔레트에서 속성을 설정할 수 있습니다. 이것을 확인하고 앱을 다시 실행하는 경우, 파일의 소유자 속성 에서이 항목을 확인할 수 없으므로 (UIViewController에도 불구 하고이 항목을 확인할 수 없으므로 VC가 정확히 나타납니다. ), view 컨트롤러가 수행하는 모든 것을 활용하여 원하는 동작을 제공 할 수 없습니다.

그 결과는 당신이 사용할 때입니다 TestViewController.xib Code에서 VC 객체를 초기화하려면 VC의 IB 특정 속성 중 어느 것도 설정되지 않으므로 Bog-Standard UiviewController가 생성되므로 "NIB에서보기 크기 조정"속성 및 탐색 항목 설정과 같은 것들이 있어야합니다. 자신을 구현했습니다.

아직 IB의 뷰 컨트롤러가 사용하는 기능을 활용할 수있는 방법을 찾지 못했습니다. initWithNibName:bundle:nibBundle (나는 그것이 우리가 접근 할 수없는 모든 개인 물건이라고 생각하지만), 이것이 바라건대 당신에게 출발점을 주었을 수도 있습니다 ...

물론, 나는 완전히 틀릴 수 있었고 누군가가 나를 완전한 바보처럼 보이게 할 것입니다!

아마도 B에서는 그 견해는 상태 표시 줄의 존재를 알지 못합니다. 그에 따라 크기를 조정하고 상태 표시 줄을 고려하기 위해 위치를 조정해야합니다. 이는 uiview의 프레임 (크기) 및 경계 (위치) 속성을 변경하여 수행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top