Storyboard를 사용한 사용자 지정보기


96

복잡한 화면 (View Controllers)에서는 모든 것을 작은 조각으로 분리했습니다 (위젯이라고 부릅니다). 이 위젯은 기본적으로 구성 MyWidget.h하고, MyWidget.m잘 한 파일 MyWidget.xib의 루트 요소가있다 파일 UIView과 MyWidget 클래스가있는 UIView의 파일 소유자이다. 이 위젯의 ​​초기화에서 나는 loadNibNamed.

내 View Controller에서를 수행 [[MyWidget alloc] init]하여 View의 Controller 기본보기에 하위보기로 추가합니다. 이것은 지금까지 완벽하게 작동합니다.

이제 스토리 보드로 어떻게 똑같이 할 수 있는지 궁금합니다. UIView어딘가 에서 드래그를 시작할 수 없기 때문에 항상으로 시작 UIViewController해야합니다.

스토리 보드로이 작업을 수행 할 수있는 방법이없는 경우, 메인 화면과 세그에 스토리 보드를 사용하고 별도의 .xib 파일을 사용하여 사용자 정의보기를 정의하여 이전 방식으로 간단히 수행 할 수 있습니까?


xib스토리 보드가 아닌 뷰 컨트롤러에 대한를 별도로 생성 하시겠습니까?
tipycalFlow

이에 대한 해결책을 찾았습니까?
aryaxt

@aryaxt : Storyboard와 xib를 혼합하여 사용하고 있습니다. 복잡한 뷰 또는 위젯의 루트로 UIView 만있는 기본 화면 및 xib의 스토리 보드. 그래서 (스토리 보드를 사용하여) 내 원래 질문에 대한 답은 아니지만 기본적으로 이전에했던 것과 똑같이 수행합니다.
znq 2012

요즘, 단지 컨테이너보기를 사용하여 정말 .. 간단합니다, stackoverflow.com/questions/23399061/...
Fattie

답변:


189

위젯 / 뷰를 별도의 .xib 파일에 넣는 것이 작동하며 특히 여러 뷰 컨트롤러에서 동일한 뷰를 참조하려는 경우에 적합합니다.

그러나 때로는 동일한 스토리 보드 내에서 추가보기 / 위젯을보고 싶을 때도 있습니다. 방법은 다음과 같습니다.

  1. IB에서보기 컨트롤러를 선택한 다음 (보기 아래의 검은 색 막대를 클릭) 개체 라이브러리에서 검은 색 막대로 UIView를 드래그합니다.

    여기에 이미지 설명 입력

  2. 뷰가 검은 색 막대에 있으면 IB의 다른 뷰처럼 인스턴스화되지만 코드에서 수행 할 때까지 뷰 계층 구조에 추가되지 않습니다. 필요한 경우 자신의 하위 클래스와 일치하도록 뷰의 클래스를 변경합니다.

    여기에 이미지 설명 입력

  3. 다른 뷰를 연결하는 것처럼 뷰 컨트롤러에 연결할 수 있습니다. 여기에 이미지 설명 입력

  4. 추가 된보기는 문서 개요에 표시되며 여기에서 작업과 참조를 연결할 수도 있습니다.

    여기에 이미지 설명 입력


이제 남은 문제는 몇 번을 클릭하거나 더블 클릭을 시도해도 실제로 뷰를 볼 수 없다는 것입니다. 이는 동일한 스토리 보드에 넣는 모든 목적을 무너 뜨립니다. 다행히 내가 아는 두 가지 해결 방법이 있습니다.

첫 번째 해결 방법은 검은 색 막대의 뷰를 뷰 컨트롤러의 뷰로 다시 드래그하고 편집 한 다음 완료되면 검은 색 막대로 다시 드래그하는 것입니다. 이것은 번거롭지 만 신뢰할 수 있습니다.

다른 해결 방법은 더 까다 롭지 만 모든 뷰를 동시에 볼 수 있기 때문에 선호합니다.

  1. 개체 라이브러리에서 새로 추가 된보기로 UITableView를 끕니다.

  2. 그런 다음 UITableViewCell을 해당 UITableView로 끕니다.

    여기에 이미지 설명 입력

  3. 그렇게하면보기가 마술처럼 옆에 튀어 나오지만 원하지 않는 UITableView가 있습니다. 0x0으로 크기를 조정하거나 삭제할 수 있으며 UIView는 (일반적으로) 계속 표시됩니다.

  4. 때때로 2 차 뷰가 IB에서 다시 숨겨집니다. UITableView를 삭제했거나 UITableView가 여전히 계층 구조에있는 경우 위 단계를 반복 할 수 있습니다. UITableViewCell을 클릭하면보기가 다시 나타납니다.

두 번째 방법은 UIViews에서 작동하지만 UIToolbars에서는 잘 작동하지 않으며 UIButtons에서는 불가능합니다. 따라서 여러 하위보기를 포함해야 할 때 찾은 가장 깨끗한 솔루션은 단일 보조 UIView를 뷰 컨트롤러에 컨테이너로 연결하는 것입니다. 표시되지 않고 모든 보조 뷰를 거기에 넣고 UITableViewCell 트릭을 사용하여 모든 것을 표시하십시오. 내 더미 UITableView의 크기를 0x0으로 조정하여 보이지 않게합니다. 다음은 모든 것이 함께 어떻게 보이는지 보여주는 스크린 샷입니다.

여기에 이미지 설명 입력


2013 년 3 월,이 작업을 수행 할 필요가 없었습니다. 검은 색 막대를 완전히 무시하고 뷰를 기본 뷰로 직접 끌어다 놓아야합니다. 그러면 제대로 작동합니다 (Xcode 4.5+)
Adam

동일한 ViewController에서 해당 사용자 정의 uivew를 재사용 할 수 있습니까? 두 개의 사용자 지정 uivews가 필요했습니다. 그렇다면 어떻게해야합니까?
Morten Gustafsson 2013 년

2
Dang, 나는 별도의 xib를 만드는 것을 선호합니다. 6 개월 안에 앱을 업데이트해야 할 때이 모든 것을 기억하지 못할 것입니다.
Sandy

이것은 멋진 대답이지만 우연히 내가 생각하는 또 다른 더 나은 방법을 찾았습니다. 콘센트를 실제보기 구성 요소에 연결할 때. 이러한 내부보기의 구성 요소 위로 마우스를 이동하면 더 쉽게 선택할 수 있도록 팝업이 표시됩니다. 그런 다음 스토리 보드에서 볼 수 있습니다 ...
Oded Ben Dov

7
이것은 믿을 수 없을 정도로 훌륭한 역사적 답변이지만 실제로는 완전히 구식입니다. 애플은 "컨테이너 뷰"를 도입하여 전체 문제를 해결했습니다. 이제는 앱을 만들 때 수행하는 핵심적이고 기본적인 작업입니다. 모든 것이 항상 "컨테이너 뷰"입니다. 감사합니다. 이제 매우 쉽습니다!
Fattie

11

스토리 보드가 아닌 다른 위치에 뷰 컨트롤러를 만들려는 경우이를 수행하는 매우 간단한 방법이 있습니다.

1) 생성 CustomViewController의 ( abcdController개별로 내가 시도 코드)를 xib평소의.

2) 스토리 보드에 UIViewController(또는 당신의 수퍼 클래스가었던 )를 추가합니다 CustomViewController.

3)로에서는 CustomClass을 설정 CustomViewController하는 대신 UIViewController다음과 같이 :

여기에 이미지 설명 입력

4) 마지막으로 viewDidLoad에서 사용자 정의를로드하면 xib완료됩니다.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
    // Do any additional setup after loading the view from its nib.
}

3
매우 자세한 답변을 보내 주셔서 감사합니다.하지만 실제로는 사용자 정의보기 컨트롤러가 아니라 표준 UIViewController에 추가되는 사용자 정의보기 (위젯)를 찾고 있습니다. 따라서 뷰 컨트롤러는 문제가 아니지만 사용자 정의 위젯을 만드는 가장 좋은 방법이 무엇인지 궁금합니다. A) 전에했던 것처럼 .xib 파일을 사용하거나 B) 아직 모르는 다른 접근 방식을 사용합니다. :-)
znq

1
흠 ... 당신이 원하는 걸 얻은 것 같아요. 기본적으로 동일한 컨트롤러로 여러 뷰를 처리하고 싶습니까? 내가 아닌 다른 방법을 생각할 수 없다 loadNibNamed... XO 경우에
tipycalFlow

이것은 나를 위해이 문제를 해결했습니다 : stackoverflow.com/questions/11047991/… 그러나 viewDidLoad 대신 loadView를 사용했습니다 ...
Morkrom

1
다시 말하면 컨테이너 뷰가 여기에 있으므로 완전히 구식입니다. 그냥 컨테이너보기를 클릭하고 모든 끝났다
Fattie

1

Storyboard에서 특정 뷰 컨트롤러의 인스턴스를 가져오고 그 위에 뷰를 사용하려면 이와 같은 작업을 수행 할 수 있다고 생각합니다.

ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main"  bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.

도움이 되었기를 바랍니다

감사합니다 Vijay

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