문제

Objective-C에는 수업에 대한 카테고리가 있습니다.

@interface UILabel(CustomInit)

- (id)initWithCoder:(NSCoder *)coder;

@end

내가하고있는 일은 여분의 일을하는 커스텀 init 함수를 작성하는 것입니다. 그리고 내가하고 싶은 것은이 커스텀 init 함수에서 Uilabel의 기본 initwithCoder를 호출하는 것입니다. 이게 가능해? 어떻게?

편집하다

감사. 좋아, 그래서 내 계획은 InitwithCoder를 오버로드 할 수는 없습니다. InitwithCoder를 과부하시키지 않고 동일한 기능 (모든 Uilabel 이이 추가 초기화 단계를 얻는 위치)을 달성 할 수있는 방법이 있습니까? 아니면 추가 코드로 다시 작성할 수있는 Uilabel의 InitwithCoder에 대한 샘플 코드가 있습니까?

편집하다

좋아, 제가 시도하는 것에 대해 분명히하기 위해 :

iPhone 응용 프로그램에 사용자 정의 글꼴을 포함시킬 수 있습니까?

개인 그래픽 서비스 기능 gsfontaddfromfile을 사용하여 누군가가 iPhone에 사용자 정의 글꼴을 수동으로 추가하는 답변이 있습니다. 이 코드를 시도했는데 레이블의 글꼴을 수동으로 설정하는 데 효과적이었습니다. 그러나 인터페이스 빌더에서 글꼴을 설정하려고하면 제대로로드되지 않고 시스템 글꼴로 떨어집니다. 내가하고 싶었던 것은 글꼴을 수동으로로드하고 IB에서 선택한 글꼴로 라벨의 글꼴을 자동으로 설정하는 것입니다. 이런 식으로 나는 내가 내려 놓은 모든 레이블에 대해 아울렛을 만들 필요가 없습니다. 나는 또한 어리석은 라벨 서브 클래스 (그 스레드에서도 제안되었고 많은 양의 맞춤형 도면을 수행 함)를 쓸 필요가 없습니다. 이제 나는 여전히 모든 라벨에 대한 서브 클래스를 만들 수 있지만 다른 UI 객체 (즉, Uibittons)에 내장 된 레이블의 경우가 있습니다. 임베디드 레이블도 깨지지 않기를 바랍니다.

모든 제안은 좋을 것입니다. 감사.

도움이 되었습니까?

해결책 2

너희들은 이것에 대해 어떻게 느끼십니까?

런타임에 InitwithCoder의 원래 메소드 주소를 잡고 정적 변수로 저장하십시오. 클래스 구현을 My InitwithCoder로 대체하기 위해 메소드 스위이즈를 수행하십시오. 그런 다음 InitwithCoder에서 정적 변수에 저장된 원래 방법을 호출합니다.

당신은 그것을 카테고리에 넣고 프로그램 시작 시이 클래스 초기화 단계를 호출하여 두 번 호출 할 수 없거나 아무것도하지 않도록 할 수 있습니다.

위험 해 보이지만 작동해야한다고 생각합니다.

다른 팁

로부터 Mac OS X 참조 라이브러리:

카테고리가 무시할 때 상속 된 방법, 범주의 메소드는 평소와 같이 Super 로의 메시지를 통해 상속 된 구현을 호출 할 수 있습니다. 그러나 카테고리가 메소드를 대체하는 경우 그것은 이미 카테고리의 수업에 존재했습니다, 원래 구현을 호출 할 방법이 없습니다.

방법 Swizzling은 Kidnamedlox가 제안한대로 작동해야합니다.

Evan Doll 의이 Stanford iTunes 클래스에서 똑같은 질문에 대해 논의했습니다.

https://podcasts.apple.com/us/podcast/iphone-application-programming-spring-2009/id384233222

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