iPhone 앱에서 뷰 및 뷰 컨트롤러로 작업 할 때 누구나 loadView와 viewDidLoad의 차이점을 설명 할 수 있습니까?
내 개인적인 맥락은 코드에서 모든보기를 작성한다는 것입니다. 인터페이스 빌더를 사용하지 않을 것입니다.
init 코드를 loadView에 추가 할 때 무한 스택 추적으로 끝나는 경우가 많으므로 일반적으로 viewDidLoad에서 모든 자식 뷰 건물을 수행하지만 각각이 실행될 때 나에게 분명하지 않습니다. init 코드를 넣기에 더 적합한 곳은 무엇입니까? 완벽한 것은 초기화 호출의 간단한 다이어그램입니다.
감사!
답변
내가 한 일 때문에 여기에서 문제가 무엇인지 짐작할 수 있습니다.
init 코드를 loadView에 추가하면 무한 스택 추적으로 끝나는 것을 자주 발견했습니다.
-loadView에서 self.view를 읽지 마십시오. 만 설정 하지 않는, 그것을 얻기 를.
self.view 속성 접근 자는 뷰가 현재로드되지 않은 경우 -loadView를 호출 합니다. 무한 재귀가 있습니다.
Apple의 Pre-Interface-Builder 예제에서 설명한 것처럼 -loadView에서 프로그래밍 방식으로 뷰를 작성하는 일반적인 방법은 다음과 같습니다.
UIView *view = [[UIView alloc] init...];
...
[view addSubview:whatever];
[view addSubview:whatever2];
...
self.view = view;
[view release];
그리고 IB를 사용하지 않았다고 비난하지 않습니다. 나는 모든 Instapaper에 대해이 방법을 고수했으며 IB의 복잡성, 인터페이스 문제 및 예기치 않은 비하인드 행동을 다루는 것보다 훨씬 더 편합니다.
답변
loadView
UIViewController
실제로 뷰를로드하고 view
속성에 할당 하는 방법입니다 . UIViewController
프로그래밍 방식으로 view
속성을 설정하려는 경우 하위 클래스 가 재정의 하는 위치이기도합니다 .
viewDidLoad
뷰가로드되면 호출되는 메소드입니다. loadView가 호출 된 후 호출됩니다. 뷰가 일단로드되면 추가 초기 설정을 수행하는 코드를 무시하고 삽입 할 수있는 위치입니다.
답변
viewDidLoad()
NIB에서보기를로드 할 때 사용되며 실행 후 사용자 정의를 수행하려고합니다.
LoadView()
프로그래밍 방식으로보기를 작성하려고 할 때 사용됩니다 (인터페이스 빌더 사용하지 않고).
답변
NilObject가 말한 것을 보여주기 위해 몇 가지 코드 예제를 추가하십시오.
- (void)loadView
{
// create and configure the table view
myTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStyleGrouped];
myTableView.delegate = self;
myTableView.dataSource = self;
myTableView.scrollEnabled = NO;
self.view = myTableView;
self.view.autoresizesSubviews = YES;
}
- (void)viewDidLoad
{
self.title = @"Create group";
// Right menu bar button is to Save
UIBarButtonItem *saveButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Save" style:UIBarButtonItemStyleDone target:self action:@selector(save)];
self.navigationItem.rightBarButtonItem = saveButtonItem;
[saveButtonItem release];
}
답변
self.view를 읽을 때 무한 루프가 발생하지 않도록하려면 뷰를로드 할 때 클래스의 수퍼 구현을 호출하십시오. 슈퍼 구현은 새로운 UIView를 할당합니다.
- (void) loadView {
[super loadview];
// init code here...
[self.view addSubView:mySubview1]; //etc..
}
답변
loadView를 사용하는 가장 쉬운 방법은 UIViewController의 하위 클래스 인 MyBaseViewController와 같은 일부 유형의 기본 뷰 컨트롤러를 만드는 것입니다. loadView 메소드는 다음과 같이 뷰를 작성합니다.
-(void) loadView {
if ([self viewFromNib]) {
self.view = [self viewFromNib];
} else {
self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
}
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
self.view.backgroundColor = [UIColor whiteColor];
}
그리고 뷰 컨트롤러를 만들어야 할 때 MyBaseViewController의 서브 클래스를 사용하고 loadView 컨트롤러에서는 다음과 같이 [super loadView]라고 부릅니다.
//sucblass loadView
-(void) loadView {
[super loadView];
//rest of code like this..
UILabel *myLabel = [[UILabel alloc] initWithFrame:myFrame];
[self.view addSubview:myLabel];
[myLabel release];
}
답변
loadView()
컨트롤러가를 생성하라는 메시지가 표시되면 호출됩니다 self.view
. 당신은처럼 혼자서 할 수 있습니다
self.view = [UIView alloc] init...];
또는 컨트롤러의 부모 UIController 클래스에는 이미 -loadView()
self.view를 빈보기로 초기화 하는 메소드 이름 이 있습니다. 그럼 당신은 전화 할 수 있습니다
[super loadView];
상속을 장려하기 때문에 두 번째 방법을 권장합니다. 뷰 컨트롤러가 UIViewController에서 직접 상속되지 않은 경우에만 해당됩니다.