programing

iPhone: 탐색 모음이 있는 모달 UITableView 컨트롤러 표시

jooyons 2023. 7. 29. 08:24
반응형

iPhone: 탐색 모음이 있는 모달 UITableView 컨트롤러 표시

저는 모달 뷰를 보여주고 있습니다.UITableViewController클래스. 왠지 내비게이션 바를 보여줄 때 표시되지 않습니다.내 코드는 다음과 같습니다.

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

나는 그것이 기본적으로 표시되는 줄 알았어요.만약 도움이 된다면, 저는 이것을 또한 다른 수업에서 부르고 있습니다.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];

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

Apple의 스토리보드 튜토리얼에서 제안하는 스토리보드를 사용하는 사용자를 위한 탐색 모음을 표시하는 한 가지 방법이 있습니다.

모달 뷰 컨트롤러는 탐색 스택에 추가되지 않으므로 테이블 뷰 컨트롤러의 탐색 컨트롤러에서 탐색 막대를 가져오지 않습니다.형식적으로 표시될 때 뷰 컨트롤러에 탐색 막대를 제공하려면 해당 탐색 컨트롤러에 내장합니다.

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

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

// 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) -> presents modally -> (내비게이션 컨트롤러에 루트로 표시할 컨트롤러가 있음)

우리는 한동안 이 접근 방식을 시도해 보았는데, 우리의 스토리보드가 내비게이션 바와 함께 형식적으로 제공되기를 원하는 다른 컨트롤러의 하나! 프레젠테이션에만 사용될 때 많은 수의 중간 내비게이션 컨트롤러에 의해 "오염"된다는 것을 알게 되었습니다.

현재 솔루션은 승인된 답변에서 사용자 지정 segue로 코드를 캡슐화하는 것입니다.

#import "ModalPresentationWithNavigationBarSegue.h"

@implementation ModalPresentationWithNavigationBarSegue

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

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

프로젝트에 이 세그가 있으므로 스토리보드에 더 이상 중간 탐색 컨트롤러를 만들지 않고 이 모달 프레젠테이션을 사용합니다.다음과 같은 Navigation BarSegue 사용:

발표자 VC --> 발표자 VC

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

저는 단지 @Scott가 말한 것에 무언가를 추가하고 싶었습니다.그의 대답은 확실히 스토리보드, iOS 7 및 8... (그리고 곧 9)에서 현재 가장 쉽고 가장 많이 받아들여지는 방법입니다.

스토리보드에 뷰 컨트롤러를 확실히 추가하고 @Scott의 설명에 따라 내장하는 것이 올바른 방법입니다.

그런 다음 소스 뷰 컨트롤러에서 대상(모델적으로 표시할 대상)으로 제어 끌어서 세그를 추가하면 세그 유형에 대한 선택사항과 함께 작은 뷰가 나타나면 "Present Modally"를 선택합니다.이름을 지정하는 것도 좋습니다(아래 예에서는 "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!";
    }
}

이것이 도움이 되길 바랍니다!

만약 당신이 단지 필요하다면.NavigationBar의인턴를추수있다니습의 할 수 .UINavigationBarBarItems를 할당합니다.

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

반응형