[iphone] 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에서 제안한 스토리 보드를 사용하는 사용자를 위해 탐색 모음을 표시하는 한 가지 방법 입니다.
모달보기 컨트롤러는 탐색 스택에 추가되지 않기 때문에 테이블보기 컨트롤러의 탐색 컨트롤러에서 탐색 모음을 가져 오지 않습니다. 뷰 컨트롤러에 모달로 표시 될 때 탐색 모음을 제공하려면 자체 탐색 컨트롤러에 포함합니다.
- 개요보기에서보기 컨트롤러를 선택합니다.
- 뷰 컨트롤러를 선택한 상태에서 Editor> 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!";
}
}
도움이 되었기를 바랍니다!