如何将导航控制器添加到不是主视图的视图?
Posted
技术标签:
【中文标题】如何将导航控制器添加到不是主视图的视图?【英文标题】:how to add a navigation controller to a view that is not the main view? 【发布时间】:2014-12-12 12:24:49 【问题描述】:我是一个初学者,正在尝试弄清楚如何正确使用 nib。
我有一个 HomeViewController.h:
#import <UIKit/UIKit.h>
#import "StackTableViewController.h"
@interface HomeViewController : UIViewController
@property (strong, nonatomic) StackTableViewController *stackViewController;
- (IBAction)goToStack:(id)sender;
@end
HomeViewController.m:
#import "HomeViewController.h"
@interface HomeViewController ()
@end
@implementation HomeViewController
- (id)init
self = [super initWithNibName:@"HomeViewController" bundle:nil];
if (self)
//
_stackViewController = [[StackTableViewController alloc]init];
return self;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
- (IBAction)goToStack:(id)sender
//[self.navigationController showViewController:_stackViewController sender:self];
[self presentViewController:_stackViewController animated:YES completion:nil];
如您所见,我正在从 HomeViewController 建模到 StackTableViewController...
现在它可以正常工作了,但我希望 StackTableViewController 嵌入到 NavigationController 中......我可以在顶部放置一个取消按钮。
这是我的 StackTableViewController.m:
#import "StackTableViewController.h"
@interface StackTableViewController ()
@property (strong, nonatomic) UINavigationController *navBar;
@end
@implementation StackTableViewController
- (void)viewDidLoad
[super viewDidLoad];
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
#warning Potentially incomplete method implementation.
// Return the number of sections.
return 0;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
#warning Incomplete method implementation.
// Return the number of rows in the section.
return 0;
我应该在 viewDidLoad 方法中添加什么来将 navBar 嵌入到 tableview 中?
tnx
【问题讨论】:
你在为你的应用使用故事板吗? 尝试呈现UINavigationController
的另一个实例,您将_stackViewController
作为根VC。
不,我不使用故事板,我想用 nib 编程一段时间,然后转到故事板 @nburk
好的,没关系,我正在写答案
【参考方案1】:
不需要将StackTableViewController
声明为HomeViewController
的属性,只需像这样修改goToStack
即可:
- (IBAction)goToStack:(id)sender
StackTableViewController *stackViewController = [[StackTableViewController alloc] init]; // shouldnt this get loaded from a NIB though???
[self presentViewController:stackViewController animated:YES completion:nil];
关于UINavigationController
的问题,根据您的设置,UINavigationController
是您应用中某个导航堆栈的基础,因此,如果您只是构建一个没有标签栏或更复杂的简单应用接口,您的UINavigationController
可能是您的应用程序主UIWindow
的rootViewController
(您的AppDelegate
的一个属性)。
因此,要使此设置生效,您需要在 application:didFinishLaunchinWithOptions
中的 AppDelegate
中设置应用程序的根窗口:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
HomeViewController *homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil]; // I assume you have a NIB file called HomeViewController
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:homeViewController];
self.window.rootViewController = navigationController;
return YES;
这将使您在应用程序启动时看到的HomeViewController
嵌入在UINavigationController
的实例中,这又是整个应用程序的rootViewController
。
然后,您可以修改goToStack
以使用UINavigationController
的此实例而不是以模态方式显示stackViewController
:
- (IBAction)goToStack:(id)sender
StackTableViewController *stackViewController = [[StackTableViewController alloc] init]; // shouldnt this get loaded from a NIB though???
[self.navigationController pushViewController:stackViewController animated:YES];
你可以在这里使用self.navigationController
,因为homeViewController
被嵌入到UINavigaitonController
中,所以ios会为你设置这个属性。
希望对您有所帮助! :)
更新:
如果您不想将 HomeViewController
嵌入到 UINavigationController
中,只需像这样修改 goToStack
:
- (IBAction)goToStack:(id)sender
StackTableViewController *stackViewController = [[StackTableViewController alloc] init]; // shouldnt this get loaded from a NIB though???
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:stackViewController];
[self presentViewController:navigationController animated:YES completion:nil];
【讨论】:
我不希望我的主视图控制器也嵌入到导航控制器中......只是表格视图将在其中......所以它会在顶部有一个标签栏 你在评论中是什么意思 // 不应该从笔尖加载吗???。我应该采取不同的做法吗?这就是它的工作原理,所以这就是我这样做的原因:) 既然你说你正在使用NIB,我假设你也会为StackTableViewController
创建一个NIB。如果你这样做了,那么你可能想要调用StackTableViewController *stackTableViewController = [[StackTableViewController alloc] initWithNibName:@"StackTableViewController" bundle:nil];
而不仅仅是[[StackTableViewController alloc] init];
,否则它将加载一个普通的UITableView
,而不需要从你的NIB文件中进行自定义。以上是关于如何将导航控制器添加到不是主视图的视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何将相同的 UIButton 添加到 iphone 中的所有视图控制器的导航栏?