2013-05-22 2 views
1

저는 iOS 앱으로 작업 중이며 iPhone 및 iPad 용으로 보편적으로 만들고 싶습니다. 이것은 아무 문제없이 수행하고 작동합니다 :유니버설 (iPhone/iPad) 앱용 iOS 컨트롤러

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
    self.viewController_iPhone = [[ViewController_iPhone alloc] initWithNibName:@"ViewController_iPhone" bundle:nil]; 
} else { 
    self.viewController_iPad = [[ViewController_iPad alloc] initWithNibName:@"ViewController_iPad" bundle:nil]; 
} 

if (self.viewController_iPhone == nil) 
    self.window.rootViewController = self.viewController_iPad; 
else 
    self.window.rootViewController = self.viewController_iPhone; 

각 컨트롤러 (ViewController_iPad.xib, ViewController_iPhone.xib)에 대한 전망이있다. 내보기에 어떤보기가로드되었는지는 중요하지 않습니다. 뷰에는 하위 뷰 (UIScrolView)가 추가되었습니다. 이 ScrollView에는 xib에서 두 가지 뷰가 있습니다.

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"SubView1" owner:self options:nil]; 
UIView *view = [nibContents objectAtIndex:0]; 
view.frame = CGRectMake(2, 0, scrollView.frame.size.width - 2, scrollView.frame.size.height); 
[scrollView addSubview:view]; 


nibContents = [[NSBundle mainBundle] loadNibNamed:@"SubView2" owner:self options:nil]; 
view = [nibContents objectAtIndex:0]; 
view.frame = CGRectMake(scrollView.frame.size.width + 2 , 0, scrollView.frame.size.width - 4, scrollView.frame.size.height); 
[scrollView addSubview:view]; 

(이 코드는 iPad/iPhone 컨트롤러에 있음) 아직도 모든 것이 OK입니다. 그러나 ScrollView에 표시된 하위 뷰의 소유자 (IB)를 설정하는 방법을 모르겠습니다. 이러한 하위보기는 기본보기에있는 ScrollView에 있으므로이 하위보기의 소유자를 iPad/iPhone 컨트롤러로 설정하려고합니다. 하지만 소유자는 단 하나의 클래스가 될 수 있습니다. 두 개의 메인 컨트롤러가 있고 런타임에 어떤 컨트롤러가로드 될지 알 수없는 경우 소유자를 설정하는 방법을 알려주시겠습니까? 고맙습니다.

편집 : 다른 질문이 있습니다. ViewController_iPhone 있습니다. View 속성이 있으며이 속성은 ViewController_iPhone (.xib)의 기본보기에있는 "루트"보기에 지정됩니다. 이 뷰 속성을 하위 뷰 뷰에도 지정할 수 있습니까? ViewController_iPhone의 뷰 속성을 IB의 서브 뷰의 "루트"뷰에 할당하면 EXC_BAD_ACCESS 오류가 발생합니다.

+0

이미로드 한 것처럼 펜촉을로드하는 경우 파일 소유자에게 아무런 의미가 없습니다. –

+0

owner : self 매개 변수로 loadNibNamed 메소드를 사용하므로 어떤 컨트롤러를 IB에서 파일 소유자로 설정해도 문제가되지 않습니다. 이 코드가있는 컨트롤러에이 소유자를 "재설정"하시겠습니까? 예를 들어 소유자가 iPhone 컨트롤러로 설정되어 있고 iPad 컨트롤러가이를로드하기 때문에 문제가되지 않습니까? – DanielH

+0

그래, 내가 말한 것 ... 당신이 펜촉에서 사용자 정의보기를로드하는 중, 당신은보기 개체에만 액세스하고 있습니다. 따라서 파일 소유자는 게임에 참여하지 않습니다. 아웃렛을 파일 소유자에게 연결하지 마십시오. 뷰 객체에 연결하십시오. –

답변

2

클래스 클러스터를 사용해야하는 것 같습니다. 이렇게하면 iPhone/iPad 인스턴스화가 추상화되므로 명시 적으로 두 인스턴스 중 하나를 인스턴스화 할 필요가 없습니다. 당신은 애플의 문서에서 클래스 클러스터링에 대해 조금 읽을 수 있습니다

http://developer.apple.com/library/ios/#documentation/general/Conceptual/DevPedia-CocoaCore/ClassCluster.html

그것은 현재 장치를 기반으로 아이폰이나 아이 패드 서브 클래스의 할당을 처리 할 마스터 뷰 컨트롤러를 만드는 요약된다.

당신은의 ViewController ALLOC 클래스 메소드를 오버라이드 (override) :

+ (id)alloc { 
     NSString *classString = NSStringFromClass([self class]); 

     NSString *append = nil; 

     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
      append = @"_iPhone"; 
     } else { 
      append = @"_iPad"; 
     } 

     NSString *subClassString = [classString stringByAppendingString:append]; 

     id subClass = NSClassFromString(subClassString); 


     id object; 

     if (subClass && ![self isKindOfClass:[subClass class]]) { 
      object = [subClass alloc]; 
     } else { 
      object = [super alloc]; 
     } 

     return object; 
    } 

방금의 ViewController 클래스를 할당 할 수 런타임에 올바른 클래스 정의 뷰 컨트롤러를 인스턴스화하는 데 사용됩니다 이런 식으로. iPhone 및 iPad 인터페이스의 추상화를 작성하고 수퍼 클래스에서 정의한 경우, IB의 소유자로 ViewController 클래스를 사용할 수 있습니다.