그럼 개념적으로 대답, 당신의 타이머는 가능성의 서브 클래스해야한다 UIView
대신 NSObject
.
IB에서 타이머의 인스턴스를 인스턴스화하려면 UIView
뷰 컨트롤러의 뷰에 끌어다 놓고 타이머의 클래스 이름으로 클래스를 설정하면됩니다.
#import
뷰 컨트롤러의 타이머 클래스를 기억하십시오 .
편집 : IB 설계 용 (코드 인스턴스화는 개정 내역 참조)
저는 스토리 보드에 전혀 익숙하지 않지만 .xib
스토리 보드 버전을 사용하는 것과 거의 동일한 파일을 사용하여 IB에서 인터페이스를 구성 할 수 있다는 것을 알고 있습니다 . 뷰 전체를 기존 인터페이스에서 .xib
파일 로 복사하여 붙여 넣을 수도 있습니다 .
이를 테스트하기 위해 .xib
"MyCustomTimerView.xib"라는 새 빈을 만들었습니다 . 그런 다음 뷰를 추가하고 여기에 레이블과 두 개의 버튼을 추가했습니다. 그렇게 :
UIView
"MyCustomTimer"라는 새로운 목표 C 클래스 하위 클래스를 만들었습니다 . 내에서 .xib
나는 내 설정 파일의 소유자 로 클래스를 MyCustomTimer . 이제 다른 뷰 / 컨트롤러처럼 액션과 아웃렛을 자유롭게 연결할 수 있습니다. 결과 .h
파일은 다음과 같습니다.
@interface MyCustomTimer : UIView
@property (strong, nonatomic) IBOutlet UILabel *displayLabel;
@property (strong, nonatomic) IBOutlet UIButton *startButton;
@property (strong, nonatomic) IBOutlet UIButton *stopButton;
- (IBAction)startButtonPush:(id)sender;
- (IBAction)stopButtonPush:(id)sender;
@end
점프해야 할 유일한 장애물은 .xib
내 UIView
하위 클래스 에서 이것을 얻는 것 입니다 . 를 사용하면 .xib
필요한 설정 이 크게 줄어 듭니다. 그리고 스토리 보드를 사용하여 타이머를로드하기 -(id)initWithCoder:
때문에 호출되는 유일한 초기화 프로그램은 우리가 알고 있습니다. 따라서 구현 파일은 다음과 같습니다.
#import "MyCustomTimer.h"
@implementation MyCustomTimer
@synthesize displayLabel;
@synthesize startButton;
@synthesize stopButton;
-(id)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super initWithCoder:aDecoder])){
[self addSubview:
[[[NSBundle mainBundle] loadNibNamed:@"MyCustomTimerView"
owner:self
options:nil] objectAtIndex:0]];
}
return self;
}
- (IBAction)startButtonPush:(id)sender {
self.displayLabel.backgroundColor = [UIColor greenColor];
}
- (IBAction)stopButtonPush:(id)sender {
self.displayLabel.backgroundColor = [UIColor redColor];
}
@end
명명 된 메서드 loadNibNamed:owner:options:
는 소리처럼 들리는대로 정확히 수행합니다. Nib을로드하고 "File 's Owner"속성을 self로 설정합니다. 배열에서 첫 번째 객체를 추출하고 이것이 Nib의 루트 뷰입니다. 뷰를 하위 뷰로 추가하고 Voila는 화면에 표시합니다.
분명히 이것은 버튼을 눌렀을 때 레이블의 배경색을 변경하지만이 예제는 당신을 잘 이해할 것입니다.
주석에 따른 참고 사항 :
무한 재귀 문제가 발생한다면이 솔루션의 미묘한 트릭을 놓쳤을 것입니다. 당신이 생각하는 일을하는 것이 아닙니다. 스토리 보드에있는보기는 표시되지 않지만 대신 다른보기를 하위보기로로드합니다. 로드되는 뷰는 펜촉에 정의 된 뷰입니다. 펜촉의 "파일 소유자"는 보이지 않는보기입니다. 멋진 부분은이 보이지 않는 뷰가 펜촉에서 가져 오는 뷰에 대한 일종의 뷰 컨트롤러로 사용할 수있는 Objective-C 클래스라는 것입니다. 예를 들어 클래스 의 IBAction
메서드 MyCustomTimer
는 뷰보다 뷰 컨트롤러에서 더 많이 기대할 수있는 것입니다.
부수적으로, 일부는 이것이 깨 졌다고 주장 할 수 MVC
있으며 나는 다소 동의합니다. 내 관점에서 볼 때 UITableViewCell
때로는 일부 컨트롤러 여야 하는 custom과 더 밀접하게 관련 되어 있습니다.
이 답변은 매우 구체적인 솔루션을 제공하기위한 것이 었습니다. 스토리 보드에 배치 된 것과 동일한 뷰 에서 여러 번 인스턴스화 할 수있는 하나의 펜촉을 만듭니다 . 예를 들어,이 타이머 중 6 개를 iPad 화면에서 한 번에 모두 쉽게 상상할 수 있습니다. 응용 프로그램에서 여러 번 사용할 뷰 컨트롤러에 대한 뷰만 지정해야하는 경우 jyavenard에서이 질문에 대해 제공 한 솔루션 이 거의 확실히 더 나은 솔루션입니다.