2015-02-02 4 views
1

후속 조치 this question.UINib을 인스턴스화하려고 할 때 :이 클래스는 키 값을 코딩하는 키 값이 아닙니다.

메인보기에 버튼이 하나있는 앱과 '비어있는'popup.xib 파일 (보기, 버튼 없음, 라벨 없음, 아무 것도 없음)이 있습니다. 버튼을 누르면 팝업이 나타나기를 원합니다. 웬일인지 버튼을 누를 때마다 다음과 같은 오류가 발생합니다.

...이 클래스는 키보기에 대해 키 값을 코딩하지 않습니다. '

나는 NIB의 콘센트가 삭제되었거나 변경 되었기 때문에 모든 개체를 제거한 이유와 빈보기를 표시하는 이유입니다. 하지만 여전히이 오류가 발생합니다.

내 코드 :

ViewController.swift

import UIKit 

class ViewController: UIViewController { 

    @IBAction func showPopup(sender: AnyObject) { 
     var x = UINib(nibName: "Popup", bundle: nil); 
     println(x) 
     var y = x.instantiateWithOwner(nil, options: nil) 

     println(y) 

     var z = y[0] as? PopupViewController 

     println(z) 
     z!.show(self.view) 
    } 


} 

PopupViewController.swift

import UIKit 


class PopupViewController : UIViewController { 

    func show(tView : UIView) { 
     tView.addSubview(self.view) 
     self.view.backgroundColor = UIColor.redColor() 
    } 

} 

출력 :

<UINib: 0x7ff822412f90> 
2015-02-02 15:47:57.870 tttt[5437:179808] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x7ff822553ec0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.' 
*** First throw call stack: 

업데이트

enter image description here


업데이트 2

나는 답변과 의견에 따라 물건을 조정 계속, 나는 var y = x.instantiateWithOwner(PopupViewController(), options: nil)을 할 경우 라인이 OK 실행 얻을 얻었다. 그런 다음 UIViewController가 아닌 UIView가 포함 된 배열을 반환합니다. 따라서 마지막 줄인 z!.show(self.view)이 충돌합니다. 올바른 바브가 만들어져 변경된 속성 (예 : 알파 값)이 println(y)의 텍스트 출력에 올바르게 표시됩니다.

이제 제 질문은 : 소유자로 instantiateWithOwner으로 무엇을 전달해야합니까?

+0

self as owner 매개 변수를 사용하려고 했습니까? –

+0

지금 시도해보십시오. 변수 z는 여전히 nil입니다. –

+0

실제로 y는 여전히 하나의 UIView 중 하나이므로 캐스트가 작동하지 않고 nil이 사용됩니다. –

답변

0

파일 소유자가 갖고있는 클래스의 종류를 확인하십시오. 이 오류는 .xib의 뷰를 일반 뷰어 속성이없는 일반 NSObject에 연결하려고 시도하는 것 같습니다.

보기로 링크하는 소유자를 원하지 않는 경우보기 아웃렛이 없는지 확인하십시오. 또한 파일의 소유자가 실제로 존재하는 개체 유형인지 확인하십시오.

+0

끝났습니다. 내 업데이트를 참조하십시오. "실제로 존재하는 대상"이란 무엇입니까? 그게 무슨 뜻인지 오타가 없음을 확인했습니다. –

+0

이미지를 예로 들자면, 실제로 프로젝트에'PopupViewController'가 있다는 것을 의미합니다 (그리고 그 파생 된 것 또는 실제로는'view' 속성을 가짐). 오류 메시지에서 NSObject에 대한 참조는 실제로 의심 스럽습니다. –

+0

'PopupViewController.swift' 파일이 빌드중인 타겟의 일부로 표시되지 않을 가능성이 있습니까? –

0

파일 소유자보기 속성을 인터페이스 작성기의보기에 연결해야합니다.

enter image description here

+0

이미 완료했습니다 –

+0

오,보기 속성이없는 소유자에게 nil을 전달합니다. –

+0

나는 무엇을 통과해야합니까? 나는 방금 다른 질문의 답을 따랐다. –

0

아마 스토리 보드 XIB 및 신속한 클래스 (미안 내가 내 아이맥하지 그리고 난 당신이 나에게 프로젝트의 우편을 보낼 말할 수 없다) 나 '사이의 연결에 약간의 간섭이있다 여기에 글을 쓰겠습니다. 보통 다음과 같은 단계를 수행하여 도움을 받으십시오.

  • 프로젝트에 Xib 파일을 만듭니다. 항상 항목을 배치하십시오. (예 : MyViewController.xib)
  • 가 (예 : MyViewController.swift) (이름은 일반적으로 XIB과 동일) 새로운 스위프트 클래스를 작성,보기> 유틸리티의 XIB를 선택하고있는 UIViewController를 선택하고 선택
  • 인터페이스 빌더에서> 쇼 신원 검사관. 은 "클래스"필드에
  • 는 사용자 정의 빠른 클래스를 선택 (MyViewController.swift)
  • 연결 IBOutlets하고이 확장 추가 MyViewController.swift에서
  • 해야하는 경우 IBActions : 당신의 MainController 추가 기능에서

    extension UIViewController { 
    class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIViewController? { 
        return UINib(
         nibName: nibNamed, 
         bundle: bundle 
         ).instantiateWithOwner(nil, options: nil)[0] as? UIViewController 
        } 
    } 
    
  • 을 버튼이 있거나 다른 장소에서이 라인을 필요로 할 때 어디서나 (버튼 클릭이나 다른 장소에서)

    var x = MyViewController.loadFromNibNamed("MyViewController") as MyViewController 
    

X는 이제 MyViewController의 인스턴스이고 Xib 파일은 이미로드되었습니다.

+0

"StoryBoard에서 Xib 파일 만들기"- 무슨 소리 야? Main.storyboard 및 Popup.xib - 두 개의 다른 파일이 있습니다. –

+0

죄송합니다. 직장에 있습니다. 오타가 항상 나를 찾고 있습니다. 나는 _ 당신의 프로젝트에서 Xib 파일을 만들었다. 내 대답을 편집 .. – Nerkyator