2010-06-25 5 views
4

테이블보기를 인터페이스로 사용하는 iphone 앱이 있습니다. 사용자가 표 셀 중 하나를 탭할 때마다 사용자에게 다른 창을 표시하려고합니다. 그러나 탐색 컨트롤러에 밀어 넣는 창의 사용자 인터페이스는 매우 유사합니다. 따라서이 generic nib 파일의 파일 소유자의 모든 하위 클래스에서 "generic nib file"을 사용하기로 결정했습니다.xcode에서 동일한 nib 파일을 사용하여 여러 개의 창을 만드는 방법

그러나 내가 뭘 혼란 스럽습니까 (그리고 작동하지 않는 것)는이 일반 nib 파일을 사용자 정의 할 수없는 것 같습니다. .H 파일에서

:

#import <UIKit/UIKit.h> 
#import "primeViewController.h" 

@interface subclass1 : primeViewController { //subclassing from a generic view controller that owns a generic nib file 

} 

하는 .m 파일에서 :이 파일의 초기화에서 코드가

#import "subclass1.h" 

@implementation subclass1 

- (id) initWithLabelAndButton { 
    if(self = [super initWithNibName:@"primeViewController" bundle:nil]) { 
     self.label.text = @"Title of the first subclass"; 

    } 
    return self; 
} 

하지만 그때를 나는의 클래스를 인스턴스화 할 때 표보기 :

//somewhere in rootviewcontroller.m: 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    switch (indexPath.row) { 
     case 0: 
     { 
      checkPrime* checkPrimeViewController = [[checkPrime alloc] initWithLabelAndButton]; 
      [self.navigationController pushViewController:checkPrimeViewController animated:YES]; 
      [checkPrimeViewController release]; 
      break; 
     } 
     default: 
      break; 
    } 
} 

아무도 내가 뭘 잘못하고 있다고 말할 수 있습니까? 또는 xcode가 nib 파일을 서브 클래스 전체에 걸쳐 여러 번 사용할 수 있다고 가정 할 때 틀린가요? 나는 그것을 할 수없는 이유를 모르지만, 어떻게되는지를 알 수는 없다 ...

+1

실제로 작동하지 않는 부분은 실제로 말한 것이 아닙니다. – Gary

+0

여러 창으로 무엇을 의미합니까?iOS 응용 프로그램에는 Window가 하나만있을 수 있습니다. – iPrabu

+0

많은 클래스를 만들려면 하나의 XIB 파일을 사용하고 싶다. 그래서 내 viewcontroller 다른 창을 밀어 넣고 싶습니다, 내가 할 수있는 템플릿 xib –

답변

4

nib 파일이로드되면, .xib로 쓰여진 것과 똑같은 클래스의 뷰 컨트롤러가 생성된다. UIViewController, 또는 PrimeViewController). .nib 파일에 실제로 저장되는 내용은 무엇입니까? UIView와 모든 해당 객체를 xib에 저장하고 [[NSBundle mainBundle] loadNibNamed : @ "YourNibFile"owner : class1ViewController options : nil]을 사용하여 해당 객체 만로드하면됩니다. nib의 뷰가 연결되어있는 동안 해당 파일 소유자 콘센트로

+0

아 .. 좋아, 그래서 우리는 실제로 xib 파일의 소유자가 programatically 그런 설정할 수 있습니까? 또 다른 질문은 프로그램 적으로 소유자를 설정하고 소유자가 IBOutlets를 가지고 있다면 제대로 설정 될까요? (음, 우리가 어떤 클래스로 인스턴스화한다면 클래스가 모든 IBOutlets를 가지고 있는지 확인해야한다는 것을 의미합니다. –

+1

내 이해는 IBOutlets가 Interface Builder를 돕기위한 코드의 힌트라는 것을 의미합니다. 당신이 콘센트로 취급하고 싶은 것을 알고 있어야합니다. 그것들이 없다면 당신의 코드를 전혀 해치지 않을 것입니다 (아울렛 자체는 없지만 다른 문제입니다). [http://www.cocoadev.com/index.pl?IBOutlet] – paulbailey

+0

좋아, 괜찮아. 나는 그것을 시험 할 시간이 없다. –

2

모든보기를 하나의 NIB에 넣으면 응용 프로그램이 시작될 때 전체 NIB를 메모리에로드하고 모든 컨트롤에 대해 모든 개체를 구성해야합니다. 많은 시간이 필요합니다.

보기를 개별 NIB로 분리하면 초기보기가 포함 된 NIB 만로드되기 때문에 앱이 훨씬 빨리 시작됩니다. 그런 다음보기가 변경되면 새보기를 포함하는 NIB를로드 할 수 있습니다. 처음 뷰를 열 때 약간의 장애가 발생합니다. 당신이 메모리 사용을 최적화하려는 경우보기로 전환 할 때 또한

, 당신은 소중한보기를 언로드 할 수

0

I 좋겠있는 UITableViewController 하위 클래스를 제안하고 다른 공통 어떤 방법, 인스턴스 변수 및 속성을 추가 여기에서보십시오. 너의 펜촉을 만들고 이것들 중 하나의 인스턴스에 대한 참조를 갖도록한다.

그런 다음, 당신은 지정된 초기화를 무시하는 충실해야한다고 하위 클래스가

GenericSubclassVC* checkPrimeViewController = [[SpecificSubclassVC alloc] initWithNibName:@"GenericNib" and Bundle:nil]; 
[self.navigationController pushViewController:checkPrimeViewController animated:YES]; 

같은 기능 사용자 정의 얻을 서브 클래스입니다. UIView 객체를 수정해야하는지에 따라 awakeFromNib 또는 viewDidLoad 메서드에 사용자 정의 초기화 코드를 추가합니다.

그러나 다른 사람들이 언급 한 것처럼 매우 효율적이거나 우아하지 않습니다. 모든 ViewController가 테이블 뷰 컨트롤러이고 동일한 데이터 모델을 표시하려면 데이터 소스 객체를 정의하는 것과 같이 코드를 다시 사용할 수있는 다른 방법이 있습니다.

관련 문제