1. init 함수
- NSObject 자식 중 일반 클래스 : init
- viewController : [[MyVC alloc] initWithNibName]로 생성
- GUI 클래스
=>코드로 생성 : [[MyView alloc] initWithFrame:rc];
=>xib로 생성 : [[MyView alloc] initWithCoder]로 초기화
2. 샘플 코드
ViewController.xib의 뷰를 MyView로 설정하고 MyView에 아래 코드 작성
@implementation MyView
-(instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
str=@"hello";
NSLog(@"MyView : %s",__FUNCTION__);
}
return self;
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
str=@"hello";
NSLog(@"MyView : %s",__FUNCTION__);
}
return self;
}
- (void)drawRect:(CGRect)rect
{
// 글씨 화면 출력
[str drawAtPoint:CGPointMake(10, 10) withAttributes:nil];
}
@end
3. 객체가 로드되는 시점
initWithNibName : 뷰가 아직 로드되지 않음
loadView : 뷰가 로드됌, view가 필요할때 이 함수가 호출되고 여기서 view를 로드, 코딩으로 뷰 컨트롤러로 만들때만 호출, xib로 만들면 불리지 않는다.
awakeFromNib : Xib와 코드의 객체들이 연결작업 한 후 호출 됌
self.view라고 호출해 버리면 이미 지연된 초기화로 생성한 후라 보임
4. 샘플코드
뷰 컨트롤러에 아래 코드 작성
@interface ViewController ()
@end
@implementation ViewController
// view가 필요할때 이 함수가 호출되고 여기서 view를 로드
-(void)loadView
{
NSLog(@"vc %s 1", __FUNCTION__);
[super loadView]; // xib load
NSLog(@"vc %s 2", __FUNCTION__);
}
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
// NSLog(@"vc : %s 1 %p",__FUNCTION__,self.view); // xib이름 모르는데 어떻게 로드? xib이름이 없으면 자기랑 동일 이름 호출
NSLog(@"vc : %s 1 %p",__FUNCTION__,self.viewIfLoaded);// 뷰가 로드된 경우만 포인터 반환
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// NSLog(@"vc : %s 2",__FUNCTION__); // 이 순간 뷰는 만들어져 있지 않다.
// NSLog(@"vc : %s 2 %p",__FUNCTION__,self.view); // self.view하는 순간 만들어져있다. 지연된 초기화
NSLog(@"vc : %s 2 %p",__FUNCTION__,self.viewIfLoaded);
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end
3번의 마이 뷰에 아래 코드 작성
@implementation MyView
// view가 생성되고 모든 outlet변수, 액션등이 초기화 된 후 호출
// 연결이 끝난 다음에 불림, 매뉴얼(부모 먼저, 해제할때만 부모 나중, templet메소드 패턴)
-(void)awakeFromNib
{
NSLog(@"v %s 1",__FUNCTION__);
NSLog(@"MyView : %s Label %p 1",__FUNCTION__,_label);
[super awakeFromNib];
NSLog(@"v %s 2",__FUNCTION__);
NSLog(@"MyView : %s Label %p 2",__FUNCTION__,_label);
}
-(instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
str=@"hello";
NSLog(@"MyView : %s",__FUNCTION__);
}
return self;
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self)
{
str=@"hello";
NSLog(@"MyView : %s",__FUNCTION__);
NSLog(@"MyView : %s Label %p",__FUNCTION__,_label);
}
return self;
}
- (void)drawRect:(CGRect)rect
{
// 글씨 화면 출력
[str drawAtPoint:CGPointMake(10, 10) withAttributes:nil];
}
@end
'교육 > iOS' 카테고리의 다른 글
[iOS] voice over 설정 (0) | 2017.06.23 |
---|---|
[iOS] 키보드 내리는 버튼 추가 (0) | 2017.03.06 |
[iOS] xib와 strong, weak (0) | 2016.08.03 |
[iOS] Xib (0) | 2016.08.01 |
[iOS] 눈내리는 애니메이션 만들기 (0) | 2016.08.01 |