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에서 제안한 스토리 보드를 사용하는 사용자를 위해 탐색 모음을 표시하는 한 가지 방법 입니다.
모달 컨트롤러는 스택에 추가하지 않기 때문에 테이블보기 컨트롤러의 탐색 컨트롤러에서 탐색 모음을 가져옵니다. 모달로 표시 때 뷰 컨트롤러에 탐색 모음을 제공 자체 탐색 컨트롤러에 포함합니다.
- 개요보기에서보기를 선택합니다.
- 뷰 컨트롤러를 선택한 상태에서 에디터> 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
의 인스턴스를 추가하고 UINavigationBar
BarItems를 할당 할 수 있습니다 .
@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!";
}
}
도움이 되었기를 바랍니다!
'IT' 카테고리의 다른 글
HEREDOC 디렉토리 내에서 PHP 함수 호출 (0) | 2020.09.13 |
---|---|
새 사용자를 만드는 SQL Server 펼쳐보기 (0) | 2020.09.13 |
이동을 목록으로 변환 (0) | 2020.09.13 |
Matlab의 tic 및 toc 함수에 해당하는 Python은 무엇입니까? (0) | 2020.09.13 |
DB에서 캐스케이드 제거와 고아 제거의 차이점은 무엇입니까? (0) | 2020.09.13 |