iPhone : 탐색 막대와 함께 모달 UITableViewController 표시


87

UITableViewController클래스 인 모달 뷰를 보여주고 있습니다 . 어떤 이유로 내비게이션 바를 표시 할 때 표시되지 않습니다. 내 코드는 다음과 같습니다.

SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
    detailViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    detailViewController.navigationController.navigationBarHidden = NO;
    [self.navigationController presentModalViewController:detailViewController animated:YES];
    detailViewController = nil;
    [detailViewController release];

기본적으로 표시되었다고 생각 했나요? 도움이된다면 .NET에서 UITableViewController관리하는 다른 클래스에서 이것을 호출 하고 UINavigationController있습니다. 아이디어?

답변:


146

모달보기 컨트롤러를 표시 할 때 기존 탐색 컨트롤러 또는 탐색 모음을 사용하지 않습니다. 원하는 것이 탐색 모음을 표시하는 것뿐이라면 탐색 모음을 모달보기의 하위보기로 추가하고 수행하는대로 표시해야합니다.

탐색 기능이있는 모달보기 컨트롤러를 표시하려면 다음과 같이 세부보기 컨트롤러가 포함 된 모달 탐색 컨트롤러를 대신 표시해야합니다.

SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
[detailViewController release];

navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:navController animated:YES];
[navController release];

모달 컨트롤러는 자체 탐색 스택을 관리합니다.


감사합니다. 설명에 감사하여 내가 뭘 잘못했는지 알 수 있습니다.
Nic Hubbard 2011 년

1
스토리 보드를 사용하는 경우이를 수행하기위한 코딩이 전혀 필요하지 않습니다. 좋은 해결책!
Jelle 2013 년

36

다음은 Storyboard에 대한 Apple의 Tutorial에서 제안한 스토리 보드를 사용하는 사용자를 위해 탐색 모음을 표시하는 한 가지 방법 입니다.

모달보기 컨트롤러는 탐색 스택에 추가되지 않기 때문에 테이블보기 컨트롤러의 탐색 컨트롤러에서 탐색 모음을 가져 오지 않습니다. 뷰 컨트롤러에 모달로 표시 될 때 탐색 모음을 제공하려면 자체 탐색 컨트롤러에 포함합니다.

  1. 개요보기에서보기 컨트롤러를 선택합니다.
  2. 뷰 컨트롤러를 선택한 상태에서 Editor> Embed In> Navigation Controller를 선택합니다.

TableViewController가 아닌 탐색 컨트롤러에 모달 segue를 추가해야합니다.
bickster 2014 년

Twitter의 사용자 프로필 편집 페이지 상황에서. 이것은 모달로 제시된 UITableViewController이며 상단에 DONE 및 CANCEL 버튼이 있습니다. 이 대답은 탐색이 일어나지 않기 때문에 그 상황에서 의미 상 의미가 없습니다.
William Entriken

17

iOS 7에서 모달 뷰 컨트롤러의 탐색 모음에 제목과 일부 버튼이 표시되기를 원하십니까? UITableViewController에서이 마법을 시도하십시오.

// in the .h
@property (strong) UINavigationBar* navigationBar;

//in the .m
- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.title = @"Awesome";
    self.navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectZero];
    [self.view addSubview:_navigationBar];
    [self.navigationBar pushNavigationItem:self.navigationItem animated:NO];
}

-(void)layoutNavigationBar{
    self.navigationBar.frame = CGRectMake(0, self.tableView.contentOffset.y, self.tableView.frame.size.width, self.topLayoutGuide.length + 44);
    self.tableView.contentInset = UIEdgeInsetsMake(self.navigationBar.frame.size.height, 0, 0, 0);
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //no need to call super
    [self layoutNavigationBar];
}

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    [self layoutNavigationBar];
}

일을하는 좋은 방법이되는 솔기. 하지만 정적 UITableViewController에서 시도 할 때 더 이상 tableview를 스크롤 할 수 없습니다. 왜 그런지 아세요?
Thomas Besnehard 2014

2
요즘에는 내비게이션 컨트롤러에 삽입하는 것이 좋습니다.
malhal

이것은 좋은 해결책이지만 한 가지 작은 문제는 스크롤 할 때 셀 헤더 제목이 탐색 막대 위에 표시된다는 것입니다.
Ali는

[self.view bringSubviewToFront:self.navigationBar];끝에 추가하여 해결했습니다 -(void)layoutNavigationBar.
Ali는

7

스토리 보드가있는 프로젝트에서 허용 된 솔루션을 사용하는 방법을 공유하고 싶습니다.

간단한 접근 방식은 모달로 표시 될 VC 앞에 스토리 보드 빈 탐색 컨트롤러를 삽입하는 것이므로 관계는 다음과 같습니다.

(발표자 VC)-> 모달로 표시-> (루트로 표시 할 컨트롤러가있는 탐색 컨트롤러).

우리는이 접근 방식을 한동안 시도해 왔으며 스토리 보드가 각각의 중간 탐색 컨트롤러에 의해 "오염"되는 것을 발견했습니다! 그들 중 하나는 독점적으로 사용됩니다! 탐색 막대와 함께 모달로 표시되기를 원하는 다른 컨트롤러의 프리젠 테이션입니다.

우리의 현재 솔루션은 사용자 정의 segue에 대한 허용 된 답변에서 코드를 캡슐화하는 것입니다.

#import "ModalPresentationWithNavigationBarSegue.h"

@implementation ModalPresentationWithNavigationBarSegue

- (void)perform {
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.destinationViewController];

    [self.sourceViewController presentViewController:navigationController animated:YES completion:nil];
}
@end

프로젝트에이 segue가 있으면 더 이상 스토리 보드에 중간 탐색 컨트롤러를 만들지 않고 다음과 같이 ModalPresentationWithNavigationBarSegue를 사용합니다.

발표자 VC-> 발표자 VC

이 답변이 앱 스토리 보드에서 불필요한 중복을 피하려는 사람들에게 도움이되기를 바랍니다.


5

만 필요한 경우 NavigationBar의 인스턴스를 추가하고 UINavigationBarBarItems를 할당 할 수 있습니다 .


그것은 ViewController에 따라 다릅니다. UITableViewController에 UINavigationBar를 추가 할 수 없다고 생각합니다.
Tobias

IB에서 Editor-> Embed in Navigation Controller로 이동하면 Navigation Bar가 있습니다. BarButtonItems를 끌어서 추가하십시오.
AmitaiB

5

@Scott이 말한 것에 무언가를 추가하고 싶었습니다. 그의 대답은 Storyboards, iOS 7 및 8을 사용하는 가장 쉽고 가장 널리 사용되는 방법입니다.

스토리 보드에 뷰 컨트롤러를 확실히 추가하고 @Scott에서 설명한대로 임베드하는 것이 올바른 방법입니다.

그런 다음 소스 뷰 컨트롤러에서 대상 (모달로 표시하려는 컨트롤러)으로 컨트롤 드래그하여 segue를 추가하고, segue 유형에 대한 선택 사항과 함께 작은 뷰가 나타나면 "모달로 표시"를 선택합니다. 이름을 지정하는 것도 좋을 것입니다 (아래 예에서는 "presentMyModalViewController"를 사용합니다).

누락 된 한 가지가 @Scott의 경우는 탐색 컨트롤러에 포함 된 모달로 표시되는 뷰 컨트롤러에 일부 데이터를 실제로 전달하려는 경우입니다.

segue.destinationViewController를 잡으면 UINavigationController에 포함 된 컨트롤러가 아니라 UINavigationController가됩니다.

따라서 내비게이션 컨트롤러 내부에 포함 된 뷰 컨트롤러를 얻기 위해 다음과 같이했습니다.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"presentMyModalViewController"]) {
        // This could be collapsed, but it's a little easier to see
        // what's going on written out this way.

        // First get the destination view controller, which will be a UINavigationController
        UINavigationController *nvc = (UINavigationController *)segue.destinationViewController;

        // To get the view controller we're interested in, grab the navigation controller's "topViewController" property
        MyModalViewController *vc = (EmailReceiptViewController *)[nvc topViewController];

        // Now that we have the reference to our view controller, we can set its properties here:
        vc.myAwesomeProperty = @"awesome!";
    }
}

도움이 되었기를 바랍니다!

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