Objective-C의 KVO 및 KVC 메커니즘을 인스턴스로 설명합니다.
6508 단어 Objective-C
최근 문제가 발생했습니다. 프로젝트의 댓글 인터페이스를 처리할 때 UIWebView 디스플레이 댓글 목록을 직접 사용했기 때문에 찾은 페이지 위아래에 CGSize(320,65)의 엉망진창인 광고가 있습니다.헤드 광고는 헤드 좌표에 자신의 로고를 붙이는 것이 편리하기 때문에 해결되었지만 꼬리 부분의 댓글이 길고 짧기 때문에 좌표도 다르다. 그러면 죽은 좌표를 정해서 로고를 붙일 수 없다. 생각한 후에 KVO를 통해 이 문제를 잘 해결했다.
@KVO 개요:
KVO, 즉: Key-Value Observing은 지정한 대상의 속성이 수정되면 대상이 알림을 받을 수 있는 메커니즘을 제공합니다.
쉽게 말하면 관찰된 대상의 속성이 수정될 때마다 KVO는 자동으로 해당 관찰자에게 통지한다.
다음 절차를 사용합니다.
1. 등록, 피관찰자의 속성을 지정,
2. 리셋 방법 구현
3. 리셋 트리거 방법
4. 관찰 제거
코드 인스턴스:
-(void)viewDidLoad{
// KVO, , "contentSize" ,
[_webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:NULL];
}
//
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context
{
if(object == _webView.scrollView && [keyPath isEqualToString:@"contentSize"])
{
// Y
CGSize size = _webView.scrollView.contentSize;
if (size.height > 568.0) {
//
_hideBottomImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, size.height-67, ScreenWidth, 67)];
_hideBottomImage.image = [UIImage imageNamed:@"banner"];
[_webView.scrollView addSubview:_hideBottomImage];
[_hideBottomImage release];
}
}
else
{
//
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
- (void)dealloc{//----> ARC dealloc , [super dealloc]
// KVO,
[_webView.scrollView removeObserver:self forKeyPath:@"contentSize"];
[super dealloc];
}
위쪽은 contentSize 속성에 대한 것이고 다른 속성은 이와 같습니다.KVC
일반적으로 우리는 속성의 set과 get 방법을 통해 값을 부여하고 추출합니다. 여기서 Key-Value-Coding(KVC) 키 값 인코딩으로 클래스의 속성에 값을 부여하고 추출하는 것을 소개합니다.
1. 기본 방식(setValue:forKey:valueForKey)
// --- Student (.m )
#import <Foundation/Foundation.h>
@class HMTClass;
@interface HMTStudent : NSObject{
NSString * _name;
BOOL _test;
BOOL _isTest;
BOOL test;
BOOL isTest;
}
@property (nonatomic,copy)NSString * name;
@property (nonatomic,copy)NSString * sex;
@property (nonatomic,assign)NSInteger age;
@property (nonatomic,strong) HMTClass * hmtClass;
@end
// ---main
HMTStudent * student = [[HMTStudent alloc] init];
student.hmtClass = [[HMTClass alloc] init];
student.name = @"humingtao”; // set
// KVC
[student setValue:@“mawei is dog" forKey:@"name”];
[student setValue:@"m" forKey:@"sex"];
[student setValue:@(10) forKey:@"age"];
//
NSLog(@"%s__%d__|%@",__FUNCTION__,__LINE__,[student valueForKey:@"name"]);
참고:
클래스에서 KVC 액세스 속성 키 순서를 검증하기 위해 4개의 BOOL 값 변수를 정의했습니다.
[student setValue:@(YES) forKey:@"test”];
결과:_test―>_isTest―>test―>isTest
2. 키 경로 액세스(클래스의 속성에 대한 setValue: ForKeyPath: forKeyPath)
//
@interface HMTClass : NSObject
@property (nonatomic,copy)NSString * name;
@end
그리고 앞의 첫 번째 점에서 Student 클래스에 학급 속성 hmt Class를 썼어요.
HMTClass *hmtClass = [[HMTClass alloc]init];
[hmtClass setValue:@" " forKey:@"name"];
[student setValue:hmtClass forKey:@"hmtClass"];
NSString *hmtClassName = [student valueForKeyPath:@"hmtClass.name"];
//
[student setValue:@" " forKeyPath:@"hmtClass.name"];
student.hmtClass.name = [student valueForKeyPath:@"hmtClass.name"];
3. 기본 데이터 유형 자동 봉인우리는 Student 클래스에 분수 속성 NSInteger number 학호를 추가합니다.
#import <Foundation/Foundation.h>
@class HMTClass;
@interface HMTStudent : NSObject
{
NSString *_name;
NSInteger number;
}
@end
[student setValue:@"100" forKeyPath:@"number"];
NSString *number = [student valueForKey:@"number"];
NSString* 유형으로 설정된 속성 값이 @ "100"인 것을 알 수 있습니다. 저희 속성은 NSInteger 유형으로 접근에 문제가 없습니다. 4. 조작 집합
Student 클래스에 NSArray를 추가하여 다른 학생을 나타냅니다.
#import <Foundation/Foundation.h>
@class HMTClass;
@interface HMTStudent : NSObject
{
NSArray *manyStudents;
}
@end
Student *student1 = [[HMTStudent alloc]init];
Student *student2 = [[HMTStudent alloc]init];
Student *student3 = [[HMTStudent alloc]init];
[student1 setValue:@"200" forKey:@"number"];
[student2 setValue:@"300" forKey:@"number"];
[student3 setValue:@"400" forKey:@"number"];
NSArray *array = [NSArray arrayWithObjects:student1,student2,student3,nil];
[student setValue:array forKey:@"manyStudents"];
NSLog(@"%@",[student valueForKeyPath:@"manyStudents.number"]);
인쇄는 배열(200300400)입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PreferenceBundle에서 오른쪽 상단에 Respring 버튼을 클릭합니다.만나서 반갑습니다, Minazuki라고합니다. 프로필 이름 : Minazuki_dev Twitter : Repo : 아직 중학생이므로 말이 이상한 곳이 있습니다만 용서해 주세요… 🙏 theos (Mac이든 단품이든 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.