2013-07-06 3 views
1

일반적으로 drawRect를 재정 의하여 사용자 지정 UIView를 만듭니다. 그것과 관련된 펜촉이있는 사용자 정의 UIView를 만들 수 있습니까? (펜촉에서 사용자 정의 UIView를 만드는 것에 대해 묻지 않음). 또는 이것은 일반적으로 첫 번째에 포함 된 두 번째보기 컨트롤러로 수행됩니까?NIB를 사용하여 사용자 지정 UIView 만들기

저는 여전히 인스턴스화하기 위해 initWithFrame을 호출 할 수 있기를 바랍니다.

들으

내가 .... 등등 그 위에 버튼과 관련된 사용자 지정 작업을하고 싶습니다 EDIT # 1 는 VC 또는 수있는 사용자 지정보기 작업 만 할 수있는이 기능인가?

+0

사용자 정의 UIView를 만들고이를 nib에 연결했는지 (사용자가 할 수 있다고 가정) 또는 nib에서 사용자 정의 UIView를로드하는지 여부는 무엇입니까? –

+0

인스펙터에서 사용자 정의 클래스를 설정 한 다음 loadNibNamed를 수행 하시겠습니까? 솔직히, iOS 프로그래밍은 거의하지 않습니다. 사람들이 그것을하는 표준 방법인가요? 나는 다른 기술에 의해 길을 잃고 있었다. – timpone

+0

네, 일반적인 관행입니다. –

답변

1

그것은 당신이 후에 무엇인지 정확하게 달성하기 어렵다 : 여기

내가 (nib 파일은 클래스 이름과 일치해야합니다)를 구현하는 것이 방법이다. nib 사용은 뷰를로드하는 한 가지 방법이며, 다른 방법은 프로그래밍 방식으로 생성하는 것입니다.

그래서, 노력하는 것은 당신이 질문에 대답하기 :

  1. 네, IB의 신원 경위을 통해 사용자 지정보기와 펜촉을 연결하는 것이 가능하다. 그러나 이것은 또한 "펜촉에서 사용자 정의 UIView 만들기"입니다. 그것은 당신이 찾고있는 것이 아닙니까?
  2. 뷰 컨트롤러 포함을 사용하여 펜촉에서 뷰를로드 할 필요가 없습니다.
  3. initWithFrame:을 호출 할 수있는 펜촉은 NSCoder을 사용해야하며 디스크에서 팽창되어 있기 때문에 펜촉을 전혀 사용하지 않습니다. 대신 -initWithCoder:을 사용해야합니다.
  4. 예, 절대적으로 코코아 콩의 사용자 정의보기는 하위보기 (UIButtons 등)의 이벤트에 응답 할 수 있습니다. 정상적으로 사용자 정의보기 하위 클래스에 IBActions을 연결합니다. 이는 MVC에 따르면 "규칙"을 위반했을 수도 있지만 뷰 컨트롤러의 일부는 아닙니다.

펜촉에서 맞춤보기를로드하는 것은 어려운 일입니다.온 호출되는 그 시점 initWithCoder에서

self.customView = [[[NSBundle mainBundle] loadNibNamed:@"View" owner:nil options:nil] lastObject]; 

:

그런

@property (strong, nonatomic) BBCustomView *customView; 

그것을 인스턴스화 (있는 좋은 장소를보기 컨트롤러에서) 사용자 정의보기에 대한 강한 속성을 만들기 사용자 정의보기. 그런 다음 해당 사용자 정의보기를 기존보기 계층 구조에 정상적으로 추가 할 수 있습니다.

nib 파일의 사용자 정의보기에 적절한 클래스를 설정하는 것을 잊지 마십시오.

조금만 더 살펴 보길 바랍니다.

+0

답을위한 thx, 이것은 다른 질문을하지만 좋은 출발점이 될 것입니다. – timpone

1

예, 할 수는 있지만 펜촉을 사용하지 않는 것보다 약 10,000 배 느린 펜촉이므로 파일이 RAM이 아닌 디스크에 저장됩니다. 많은 뷰를 작성하는 경우에는 이런 식으로하지 마십시오.

기본적으로 init 메소드는 nib 파일을로드하고 nib (동일한 클래스로 정의되어야 함)의 뷰를 가져오고 대부분의 init 메소드처럼 자체를 반환하는 대신 nib에서 뷰를 반환합니다.

언어 문서를 보면 init 메소드가 "self"가 아닌 다른 객체를 반환하는 것이 일반적이라는 것을 알 수 있습니다.

ARC를 사용하지 않는 경우 자아를 해제하고 반환 할보기를 유지해야합니다.

- (instancetype)initWithFrame:(CGRect)frame 
{ 
    if (!(self = [super initWithFrame:frame])) 
    return nil; 

    NSArray *loadedObjects = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:@{}]; 
    id newView = nil; 
    for (id loadedObject in loadedObjects) { 
    if ([loadedObject isMemberOfClass:[self class]]) { 
     newView = loadedObject; 
     break; 
    } 
    } 

    // if ARC is disabled, you must do this: 
    // [self release]; 
    // [newView retain]; 

    self = newView; 

    self.frame = frame; 

    return self 
} 
+0

그래서 펜촉을 맞춤보기와 연결하려면 어떻게해야합니까? UIView의 하위 클래스에서 loadNibNamed를 수행해야합니까, 아니면이 사용자 정의보기를 인스턴스화하려는 컨트롤러에서 호출해야합니까? – timpone

+0

나는 UIView의 하위 클래스에서이 작업을 수행합니다. 모든 것은 init 메소드 내부에 있어야합니다. –

+0

@timpone 샘플 코드를 포함하도록 내 대답을 편집했습니다. –

관련 문제