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

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

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



답변

프로그래밍 방식으로 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];


답변

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

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

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

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


답변

시도해 볼 수 있습니다.

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


답변

[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))
    }
}


답변

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
    }

}

너 끝났어 🙂

여기에 이미지 설명 입력


답변

신속한 3 및 4 용

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


답변

대한 스위프트 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)