첫 등장 공공 호
아이폰 OS 13 전에 일반적 등의 UITextField _placeholderLabel에 대한 접근으로 개인 인스턴스 변수에 대한 액세스를 달성하기 위해 KVC를 사용하여 일반적으로 수행
extension UITextField {
var placeholderLabel: UILabel? {
get {
return value(forKey: "_placeholderLabel") as? UILabel
}
}
}
复制代码
12까지,이 방법은 잘 아이폰 OS를 실행하지만, 아이폰 OS (13), 충돌에서 실행으로 업그레이드 :
*** 인해 캐치되지 않는 예외 'NSGenericException'응용 프로그램 종료, 이유 : UITextField에의 _placeholderLabel의 바르에 '액세스하는 행위는 금지됩니다. 이 '응용 프로그램 버그
의미 액세스 바르를 금지하는 분명하다,이은 버그 APP에 의해 발생합니다.
음, KVC는 원래의 논리를 유지하면서, 어떻게 그것을 할, 아이폰 OS (13) 적응하기 위해, 필요 사용할 수 없습니다? 이 런타임은 시도 할 수 있습니다!
extension UITextField {
var placeholderLabel: UILabel? {
get {
return getIvar(name: "_placeholderLabel") as? UILabel
}
}
}
复制代码
실행 다시, APP는 더 이상 붕괴되지 않습니다.
getIvar 방법은 코드가 비교적 간단하다 _ivar에 액세스하기 위해 런타임을 사용, 내 패키지의 확장입니다 :
extension NSObject {
func getIvar(name: String) -> Any? {
guard let _var = class_getInstanceVariable(type(of: self), name) else {
return nil
}
return object_getIvar(self, _var)
}
}
复制代码
이러한 세부 사항은 아마 애플 개발자의 태도를 이해할 수 변경에서, 관리는 개발자가 깔끔하게 줄에 문서에 따라 개발, 영리하지만 쓸모 사용하지 않도록 노력하겠습니다.
그러나 수요가 아 허용하지 않습니다 ...
현재는 아이폰 OS (13)에 대해 여전히 개발자 테스트 버전, 개발자가 구덩이에 단계가 필요 후 많은있을 수 있습니다.
HTTPS : //juejin.im/post/5cfc5e975188256073337c6a 재현