내가 말할 수있는 한, 때로는 비표준 스타일링을 수행하기 위해 UINavigationBar를 하위 클래스 화하는 것이 실제로 필요합니다. 카테고리 를 사용하여 그렇게하지 않아도되는 경우도 있지만 항상 그런 것은 아닙니다.
현재 내가 아는 한 UIViewController 내에서 사용자 지정 UINavigationBar를 설정하는 유일한 방법은 IB (즉, 아카이브를 통해)를 통하는 것입니다.
이것은 종종 괜찮지 만 때로는 IB를 사용하는 것이 실제로 불가능합니다.
그래서 세 가지 옵션을 보았습니다.
- UINavigationBar를 하위 클래스로 만들고 모든 것을 IB에 연결 한 다음 UINavigationController를 원할 때마다 펜촉을로드하는 것에 대해 고민합니다.
- 사용 방법 교체 범주 내에서 오히려 서브 클래스보다 UINavigationBar의 동작을 변경하거나하는
- UINavigationBar를 하위 클래스로 만들고 UINavigationController의 보관 / 보관 해제에 대해 약간의 작업을 수행합니다.
이 경우 옵션 1은 실행 불가능 (또는 적어도 너무 짜증이 난다)이었습니다. 프로그래밍 방식으로 UINavigationController를 만들어야했기 때문에 2는 약간 위험하고 제 생각에는 최후의 수단 옵션에 가깝기 때문에 옵션 3을 선택했습니다.
내 접근 방식은 UINavigationController의 '템플릿'아카이브를 만들고 아카이브를 해제하여 initWithRootViewController
.
방법은 다음과 같습니다.
IB에서는 UINavigationBar에 대한 적절한 클래스 집합을 사용하여 UINavigationController를 만들었습니다.
그런 다음 기존 컨트롤러를 가져 와서 +[NSKeyedArchiver archiveRootObject:toFile:]
. 시뮬레이터의 앱 델리게이트 내에서이 작업을 수행했습니다.
그런 다음 -i 플래그와 함께 'xxd'유틸리티를 사용하여 저장된 파일에서 c 코드를 생성하고 아카이브 된 버전을 내 하위 클래스 ( xxd -i path/to/file
)에 포함했습니다.
내 initWithRootViewController
내가 보관 해제의 결과에 해당 템플릿 및 설정 자체를 보관 해제 :
// This is the data from [NSKeyedArchiver archivedDataWithRootObject:controller], where
// controller is a CTNavigationController with navigation bar class set to CTNavigationBar,
// from IB. This c code was created using 'xxd -i'
static unsigned char archived_controller[] = {
0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30, 0xd4, 0x01, 0x02, 0x03,
...
};
static unsigned int archived_controller_len = 682;
...
- (id)initWithRootViewController:(UIViewController *)rootViewController {
// Replace with unarchived view controller, necessary for the custom navigation bar
[self release];
self = (CTNavigationController*)[NSKeyedUnarchiver unarchiveObjectWithData:[NSData dataWithBytes:archived_controller length:archived_controller_len]];
[self setViewControllers:[NSArray arrayWithObject:rootViewController]];
return [self retain];
}
그런 다음 사용자 지정 탐색 모음이 설정된 UIViewController 하위 클래스의 새 인스턴스를 가져올 수 있습니다.
UIViewController *modalViewController = [[[CTNavigationController alloc] initWithRootViewController:myTableViewController] autorelease];
[self.navigationController presentModalViewController:modalViewController animated:YES];
이렇게하면 탐색 모음과 도구 모음이 모두 설정되고 사용자 지정 탐색 모음 클래스가있는 모달 UITableViewController가 제공됩니다. 약간 불쾌한 메서드 교체를 할 필요가 없었고, 프로그래밍 방식으로 작업하고 싶을 때 펜촉을 만질 필요가 없습니다.
나는 +layerClass
UINavigationController 내 에서 동등한 것을보고 싶습니다 +navigationBarClass
--지금은 작동합니다.