2016-09-01 5 views
0

UITextField+MaxLength 같은 UITextField swimszled, 나는 예를 들어 +load 메서드를 구현하는 메서드를 구현하지만 접두사 헤더 또는 다른 파일에서 가져 오지 않았다, SomeViewController로 가져 오기만하면됩니다.대칭 -c에서 메서드 swizzled 효과적인 곳곳에

swizzled는 SomeViewController에서만 작동해야한다고 생각하지만, 왜 모든 방법을 사용합니까? UITextFieldUISearchBar입니다. 및 응용 프로그램을 실행할 때 +load 메서드를 호출 할 수 있습니까?

편집 내가 텍스트가 변경 관찰 KVO를 사용하려는의 때문에, 나는 스위 즐링 사용하는 이유를 지적해야 할, 그래서 만약 내가는 setText를 스위 즐링 및 displayLength라는 이름의 속성 NSNumber를 연결, 그렇게 생각

KVO를 사용하지 마라.이 카테고리의 가장 큰 부분을 제거 할 수 있으며 특정 최대 길이까지 부분 문자열을 잘라낼 수있다.

+0

그게 바로 swizzling의 작동 방식입니다. 특정 필드의 길이를 제한하려면 텍스트 필드 대리자 메서드를 사용하십시오. – dan

+0

당신을 이해하는 것이 정말 어렵습니다. 그러나 KVO를 사용하고 싶다면 바로 진행하십시오. 당신은 방법 swizzling 그것을 할 필요가 없습니다. KVO는 문제를 해결하고 인스턴스 기반별로 작업합니다. 이것은 isa swizzling을 사용하고 메서드를 swizzling하는 대신 메서드를 재정의하기 때문에 발생합니다. –

답변

2

스무딩은 런타임에 발생합니다. 만약 당신이 swizzle을 수행한다면, 그것은 진실로 그 클래스의 메소드의 구현을 변경합니다. 코드를 UITextField으로 변경 한 것과 같습니다.

이것이 방법 swizzling이 그렇게 희귀하고 위험한 이유입니다. UITextField의 특정 인스턴스를 변경하려는 경우 하위 클래스 (또는 카테고리 제목에서 의도를 추측하여 대리인을 사용하십시오).

+0

Hum, 내 문제는 내가 아무 일도하지 않을 때로드가 호출되는 이유라고 생각합니다.하지만 내 프로젝트에서는 일부 타사를 사용합니다. 당신이 제안한 것에 대해 감사 할 때까지로드가 호출되지 않았습니다.하지만 UITextField를 사용하는 모든 곳에서 위임 메소드를 구현하면 중복 코드가 많이 생깁니 까? –

+0

코드를 복제 할 필요가 없습니다. 모든 텍스트 필드가 동일한 방식으로 작동하는 경우 모든 동일한 위임을 제공 할 수 있습니다. – andyvn22

+0

어쩌면 내가 무슨 뜻인지 알겠지만, 다른 개발자가 같은 위임 메서드를 구현해야한다면 위임자의 하위 클래스를 만들어야합니까? –