UIView에서 xib 파일을로드하는 방법


111

나는 모든 곳에서 수색을 해왔고 지금까지 아무것도 나를 위해 일하지 않았습니다.

기본적으로 rootView.xib라는 .xib 파일을 원하고 그 안에 화면의 절반 만 차지하는 UIView (containerView라고 부릅니다)를 원합니다 (일반 뷰와 새 뷰가있을 것입니다). 그런 다음 firstView.xib라는 다른 .xib 파일을 원하고 containerView 내부에로드합니다. 그래서 나는 firstView.xib에 많은 것들이 있고 rootView.xib에 다른 많은 것들이 있고 rootView.xib의 containerView 내부에 내 firstView.xib를로드 할 수 있지만 화면의 절반 만 차지하므로 여전히 볼 수 있습니다. rootView.xib의 물건


2
이 퀘스트는 구식입니다. 몇 년 동안 지금, 단순히 컨테이너 뷰를 사용하여 튜토리얼
Fattie

답변:


181

프로그래밍 방식으로 xib 파일에서 객체를 가져 오려면 다음을 사용할 수 있습니다. [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil] 이것은 xib의 최상위 객체 배열을 반환합니다.

따라서 다음과 같이 할 수 있습니다 .

UIView *rootView = [[[NSBundle mainBundle] loadNibNamed:@"MyRootView" owner:self options:nil] objectAtIndex:0];
UIView *containerView = [[[NSBundle mainBundle] loadNibNamed:@"MyContainerView" owner:self options:nil] lastObject];
[rootView addSubview:containerView];
[self.view addSubview:rootView];

@PaulSolt 선생님이 질문과 관련된 질문이 있습니다. xib의 하위보기를 슬라이드 메뉴로 열고 싶습니다. 뷰 컨트롤러에서 메뉴 버튼을 클릭하면 서브 뷰 (xib의 절반 화면) 만 슬라이드되어야합니다. 가능하면 도와주세요.
sandeep tomar

와 함께 작동하지 않습니다 thisView.alpha = 0. thisView.superview(없음 표시)
Jack

24

다른 .xib 파일 내의 .xib 파일에서 UIView를로드하기 위해 github에서 샘플 프로젝트를 만들었습니다. 또는 프로그래밍 방식으로 수행 할 수 있습니다.

다른 UIViewController 객체에서 재사용하려는 작은 위젯에 유용합니다.

  1. 새로운 접근 방식 : https://github.com/PaulSolt/CustomUIView
  2. 원래 접근 방식 : https://github.com/PaulSolt/CompositeXib

.xib 파일에서 사용자 지정 UIView로드


훌륭한 lib, 훌륭하게 작동합니다! 아직도 직접 사용하고 계십니까? :)
AnthoPak

커피 레시피가 시작될 때 BrewCoffeeApp.com 에서 사용자 정의보기를 위해 Storyboard 및 XIB 파일과 함께이 로딩 기술을 사용합니다 .
Paul Solt

21

시도해 볼 수 있습니다.

UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];

당신이 제안한 것이 정확히 아닙니다. 그는 "rootView.xib"가 "containerView"라는 화면 크기의 절반 크기의 subView를 가질 것이라고 말했습니다. 그리고 containerView에 그는 그의 nib "firstView.xib"의 내용을로드하기를 원했습니다.
NJones

19

[Swift 구현]

xib에서 뷰를로드하는 보편적 인 방법 :

예:

let myView = Bundle.loadView(fromNib: "MyView", withType: MyView.self)

이행:

extension Bundle {

    static func loadView<T>(fromNib name: String, withType type: T.Type) -> T {
        if let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T {
            return view
        }

        fatalError("Could not load view with type " + String(describing: type))
    }
}

1
최신 Swift에 let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
따르면

6

XIB 파일 만들기 :

파일-> 새 파일-> iOS-> 코코아 터치 클래스-> 다음

여기에 이미지 설명 입력

"XIB 파일도 생성"을 확인하십시오.

함께 공연하고 tableview싶어서 서브 클래스를 선택했습니다UITableViewCell

당신은 당신의 requerment로 선택할 수 있습니다

여기에 이미지 설명 입력

원하는대로 XIB 파일 디자인 (RestaurantTableViewCell.xib)

여기에 이미지 설명 입력

우리는 각 행을 hegiht로 설정하기 위해 행 높이를 잡아야합니다.

여기에 이미지 설명 입력

지금! 그들에게 신속한 파일을 가져갈 필요가 있습니다. 나는 헐떡 restaurantPhoto이고 restaurantName당신은 당신 모두를 헐 수 있습니다.

여기에 이미지 설명 입력

이제 UITableView 추가

여기에 이미지 설명 입력

name
.nib 확장자를 포함 할 필요가없는 nib 파일의 이름입니다.

owner
nib의 File 's Owner 개체로 할당 할 개체입니다.

options
nib 파일을 열 때 사용할 옵션이 포함 된 사전.

먼저 정의하지 않은 경우 모든 뷰를 가져옵니다. 따라서 해당 세트 내에서 하나의 뷰를 가져와야합니다 frist.

Bundle.main.loadNibNamed("yourUIView", owner: self, options: nil)?.first as! yourUIView

여기 테이블 뷰 컨트롤러 전체 코드

import UIKit

class RestaurantTableViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let restaurantTableviewCell = Bundle.main.loadNibNamed("RestaurantTableViewCell", owner: self, options: nil)?.first as! RestaurantTableViewCell

        restaurantTableviewCell.restaurantPhoto.image = UIImage(named: "image1")
        restaurantTableviewCell.restaurantName.text = "KFC Chicken"

        return restaurantTableviewCell
    }
   // set row height
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 150
    }

}

너 끝났어 :)

여기에 이미지 설명 입력


1
제발 말씀해 주시겠습니까? 왜 아래는 내가 기쁠 것이다 투표
Nazmul 하산

6
귀하의 예는 xib로드에서 볼 수 있습니다. 그러나있는 tableView 것이 잘못 - 재사용 세포되는 올바른 방법
빅토르

4

신속한 3 및 4 용

let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as? CustomView

2

대한 스위프트 4.2

NibView 라는 클래스가 있고 관련 nib 파일이 NibView.xib 라고 가정 해 보겠습니다.

class NibView: UIView {

    class func getScreen() -> NibView {
        let xib = Bundle.main.loadNibNamed(String(describing :self), owner: self, options: nil)
        let me = xib![0] as! NibView
        return me
    }

}

클래스의 인스턴스를 만들고 원하는대로 특정 레이아웃으로보기에 추가

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.