IT

iPhone : 탐색 막대로 모달 UITableViewController 표시

lottoking 2020. 9. 13. 10:53
반응형

iPhone : 탐색 막대로 모달 UITableViewController 표시


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있습니다. 아이디어?


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

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

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

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

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


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

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

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

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];
}


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

간단한 접근 방식은 모달로 표시 될 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

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


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


@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!";
    }
}

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

참고 URL : https://stackoverflow.com/questions/4600448/iphone-show-modal-uitableviewcontroller-with-navigation-bar

반응형