2015-01-25 3 views
2

최근에 내 프로젝트를 Swift로 업그레이드했으며 내 viewController에 대한 강력한 참조를 유지하면서 동적으로 XIB를 인스턴스화하는 방법을 찾으려고합니다. viewController의 문자열 표현을 사용하면 오타가 발생하기 쉽고 각 XIB 이름이 무엇인지 기억하기가 어려우며 내가 선택한 경우 XIB의 이름을 바꾸기가 매우 어려우므로 NSBundle.mainBundle().loadNibNamed("someXib")을 호출해야하는 것을 싫어합니다.Swift : ViewController를 인스턴스화 할 때 XIB로드

목표 - C에서

, 나는 단지의 ViewController를 인스턴스화과 같이 밀어 것 :이 강하게 참조 내 viewcontrollers (및 관련 XIB을)에 나를 수

CRMyViewController *myVC = [CRMyViewController new]; 
[self.navigationController presentViewController:myVC animated:YES completion:nil]; 

하고 있다면 철자가 잘못되거나 이름 내 viewcontroller, 내 프로젝트는 단순히 컴파일되지 않습니다.

Swift-XIB를 참조하는이 방법을 시도해도 내보기가로드되지 않습니다. 그러나 나는 내 viewcontroler 내부에 간단하게 오버라이드 (override)에는 loadView가 원하는 것을 가까이 얻을 수있었습니다 : 내가 원하는

override func loadView() {    
    NSBundle.mainBundle().loadNibNamed("CRMyViewController", owner:self, options:nil) 
} 

이 가까운 한 번 난 단지 하드 코드 XIB 이름을 이후 (실제의 ViewController 내부) 그러나 나는 여전히보다 역동적 인 접근법을 선호합니다.

ViewController와 함께 Swift-XIB를 동적으로로드 할 수있는 방법이 있습니까? 내가 생각할 수있는 유일한 방법은보다 동적 인 방식으로에는 loadView를 내 자신의 기본의 ViewController를 작성하고 무시하는 것입니다

override func loadView() {   
    var className:NSString = NSStringFromClass(self.classForCoder) 
    className = className.componentsSeparatedByString(".").last as NSString 
    NSBundle.mainBundle().loadNibNamed(className, owner:self, options:nil) 
} 

의 ViewController와 함께 XIB를로드 할 수있는 더 나은 방법이 있습니까? 어떻게 이것이 신속하고 객관적이지 않은데 왜 필요합니까?

+0

나는 확실히 당신의 질문의 첫 번째 부분을 이해하지 않습니다. 뷰 컨트롤러가 자신의 내부 코드에서 펜촉을로드하지 않으면 Objective C에서 새 뷰 컨트롤러를 인스턴스화하면 펜촉이로드되어서는 안됩니다. 스위프트에서는 별다른 변화가 없어야합니다. Swift에 방법이없는 것처럼 펜촉 이름을 지정하지 않고 펜촉을로드하는 방법은 없습니다. – bjtitus

+0

그것이 내가 목표에서 매번 그것을하는 방법입니다. c. 내가하는 모든 것은 viewcontroller를 인스턴스화하고 그것을 표시하고 내 xib/view가 함께로드됩니다. 나는 위의 신속한 코드처럼 멋진 것을 할 필요가 없었다. – Oren

+0

내가 틀렸어. nib 문서에는 뷰 컨트롤러와 관련 펜촉의 링크가 언급되어 있습니다. 나는 전에 그런 식으로 사용한 적이 없다. 깨지기 쉬운 것 같아. 나는 더 많이 파헤 치고, 계속하고있는 것을 보려고 노력할 것이다. – bjtitus

답변

5

당신은 @objc 블록을 지정하여 클래스의 이름을 지시 할 수 있습니다

@objc(CRMyViewController) class CRMyViewController: UIViewController { 

} 

이 잘못된 이름을 사용 _loadViewFromNibNamed:bundle:으로 문제를 해결해야한다.

당신은 클래스 이름이 여기 스위프트 작동 방법에 대한 좀 더 자세한 사항을 알아 볼 수 있습니다 Get class name of object as string in Swift

+0

당신 말이 맞아요. 그래서 문제가 신속하게 잘못되었다고 생각하십니까? 솔직히 말해서, 귀하의 솔루션이 내 baseviewcontroller가 loadview를 무시하는 것보다 낫지는 않습니다. 각 클래스를 @objc로 감싸는 것을 기억하지 않아도됩니다. 기존 Baseview 컨트롤러에서 상속하는 것이 훨씬 쉬워서 계속 확장 할 수 있습니다. +1 답변. -1 벙어리로 변하다. – Oren

+0

@Oren 이런 식으로하는 것의 이점은 클래스 이름에 의존하는 다른 모든 개인용 API가 작동한다는 것입니다.클래스 네임 스트링의 특정 구현에 의존하는'.'을 쪼개는 해결책에서, 변경 될 것 같지는 않지만 경고를하지 않을 수 있습니다. – bjtitus

+0

왜 xcode가 기본값으로 추가하지 않습니까? 어떤 해악/반향이 있습니까? – Oren

관련 문제