2014-06-07 2 views
3

잠시 동안 문제없이 테이블에 사용자 정의 셀 (고유 한 닙)을 사용했습니다. 이제 새로운 프로젝트에서 더 많은 뷰를 유지하기 위해 제목, 버튼 및 다른 UIVIew가있는 재사용 가능한 사용자 정의보기 (셀이 아님)에 대한 필요성을 알게되었습니다. 나는 "제"를 부를 것이다 :iOS - 다른보기를 포함 할 수있는 사용자 정의보기

enter image description here

아이디어는 스토리 보드에서이 섹션 (UIView의를 사용하고 그에 따라 사용자 정의 클래스를 설정)을 사용할 수있게하는 것입니다. 그런 식으로 UIView 내부에 넣은 뷰는 내부 UIView에 실제로 포함될 것입니다.

실제로 어려운 부분은 IB와 Storyboard를 실제로 사용하여 뷰를 가져 와서 실제로 내부 UIView 대신 루트 UIView 섹션에 위치하게 될 것이라고 생각했습니다. 단지 내부 뷰가없는 사용자 정의보기를 만들면 예상대로 작동하지 않습니다.

#import "SectionContainer.h" 

@implementation SectionContainer 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SectionContainer" owner:self options:nil]; 
     self = [nibArray objectAtIndex:0]; 
     /*NSArray *nibRoot = [[UINib nibWithNibName:@"SectionContainer" bundle:nil] instantiateWithOwner:self options:nil]; 
     [self addSubview:[nibRoot objectAtIndex:0]];*/ 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     // Initialization code 
     NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SectionContainer" owner:self options:nil]; 
     self = [nibArray objectAtIndex:0]; 
     /*NSArray *nibRoot = [[UINib nibWithNibName:@"SectionContainer" bundle:nil] instantiateWithOwner:self options:nil]; 
     [self addSubview:[nibRoot objectAtIndex:0]];*/ 
    } 
    return self; 

} 

일치하는 XIB는 루트 볼 수있다 : 여기 짓을했는지와 (일반의 UIView의 특정 초기화 방법에 따라 조정하지만) 일한 사용자 정의 세포의 수십 기반으로하는 코드입니다 (내가 정의 세포에서하는 것처럼)이 사용자 정의 클래스

인한 문제

이 사용자 정의 클래스 2 = A EXC_BAD_ACCESS 코드를 원인과 내가 단계별로 말할 수있는 것과, 그것이 마치의 설정 클래스는 재귀 적으로 호출되고 있습니다. initWithDecoder에 대한 호출이 된 후 EXC_BAD_ACCESS 오류가 나는 내가 그에게 XIB의 파일 소유자를 설정했다 다른 접근 방식을 시도 보이는 재귀 호출을 감안할 때

  • 을 시도했다

    를 발생할 때까지 호출 한 후 전화 XIB의 루트보기 대신 사용자 지정 클래스. 이성

'NSUnknownKeyException': '[setValue의 : forUndefinedKey :] :이 클래스는 약간 다른 방법을 시도 코딩 규격을 키 sectionContainerView

  • 의 키 값이 없다를 이것은 다음과 같은 오류가 발생 (위의 코드에서 주석으로 처리 됨) XIB의 루트가 사용자 정의 클래스 (addSubView)에 설정되는 대신 추가됩니다. 이것은 동일한 재귀 호출 (또는 위의 오류가 설정되어있는 경우)을 변경하지 않았습니다.

정말 이에 대한 몇 가지 지침을 알려 주시면 감사하겠습니다. 고맙습니다.

답변

0

스토리 보드에 Custom Container View이라는 구성 요소를 사용해야합니다. 그것은 당신의 스토리 보드의 일부 구성을 포함하고 코드는 귀하의 의견/벤처을 측량 할 방법에 따라 달라질 수 있기 때문에 난 그냥 여기에 코드를 게시 할 수 없습니다,하지만 당신은 여기에 관련 가이드를 읽을 수 있습니다

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 이게 진짜 대답입니까? 커스텀 뷰 컨트롤러는 별개의 기능 UI 요소를 분류하는 것과 유사하다고 생각했습니다. 예를 들어, 목록의 각 옵션에 표시된 컨텐츠와 목록을 분리하십시오. 내가 찾고있는 것은 단일 화면의 개별 콘텐츠를 둘러싼 반복적 인 래퍼입니다. 구체적인 예 : 기본 설명, 갤러리 미리보기, 연락처 목록, 주소 및 영업 시간과 같은 섹션이있는 비즈니스의 세부 정보가 담긴 화면. 주어진 스크린은이 섹션을 몇 개라도 가질 수 있습니다. – RobertoCuba

+0

그것은 타협입니다. 문제는 배열로로드 할 수있는 nib 파일과는 달리 해당 배열에서로드 할 UIView를 체리로 선택할 수 있다는 점입니다. 스토리 보드 파일은 UIViewController를 루트 요소로 사용하여 전체 그림을 포함하도록 설계되었으며 모든 요소를 ​​연결하는 경로는 하나의 파일. 로드 될 루트 VC가 무엇인지 정의하거나 스토리 보드 파일에서 임의의 VC를 사용자 지정로드 할 수 있지만 개별적으로로드 할 수있는 루트 요소로 단독으로 UIView를 배치 할 수는 없다고 생각합니다. –

+0

아직도 나에게는 이상한 것처럼 보이지만 나는 이것을 조사 할 것이다. 그러나 논증의 목적으로이 사용자 정의보기 내부의 IB/Storyboard에 더 많은 뷰를 정의하려고하지 않았다고 가정합니다. 위의 코드가 내가 만든 모든 사용자 정의 셀에 대해 정상적으로 작동 할 때 왜 작동하지 않는지 알 수 있습니까? 나는 여전히 사용자 정의보기를 작동시키는 것을 잘못하고있다는 것을 알고 싶습니다. (다른 내용이있는 것을 염두에 두지 마십시오.) 답장을 보내 주셔서 다시 한 번 감사드립니다. – RobertoCuba

0

첫째, 재귀 호출은 initWithCoder :에 있으며, 펜촉을로드하는 것은 initWithCoder :를 통해 뷰를 설치하는 것을 의미합니다.

이런 식으로 코코아 콩으로 디자인 한 UIView 하위 클래스를 사용할 수 없습니다 (실제로 스토리 보드 또는 다른 nib의보기 클래스를 설정하여).

코드를 사용하여 펜촉을 통해 인스턴스화하는 유일한 방법이 있습니다.

Section *sectionView = [[[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:options] objectAtIndex:index]; 

지금, 당신이 만든 펜촉에서 배선까지 일을 함께 : 당신은 펜촉에서 발견되지 않은 다른 개체에 대한 당신의 펜촉에있는 객체의 연결을 만들 수 있습니다. 이것이 바로 File Owner입니다. 당신은 그것의 (File Owner 's) 클래스를 설정하고 그것에 연결을하고, 연결을 실현시키고 자하는 그 클래스의 인스턴스를 펜촉을 적재 할 때 owner 매개 변수로 사용해야한다.

그러나 나는 이것이 당신이 원하는 것이 아닐 것이라고 생각합니다. 나는 당신이 펜촉의 뿌리보기라고 가정하는 "단면도"를 통해 접근 가능한 펜촉의 하위 뷰를 만들고 싶다고 생각합니다. Section 클래스에 IBOutlet (또는 IBAction, IBOutletCollection) 속성을 만듭니다. 이것을 펜촉의 나머지 물체와 연결하려면 펜촉의 "단면"뷰를 클릭하여 제어하십시오. 그러면 거기에서 무엇을해야할 지 알 수 있습니다.

관련 문제