如何将导航控制器添加到不是主视图的视图?

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 可能是您的应用程序主UIWindowrootViewController(您的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文件中进行自定义。

以上是关于如何将导航控制器添加到不是主视图的视图?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - 如何将导航控制器添加到视图?

如何将选项卡栏添加到默认视图并使用导航控制器与其他视图通信

如何将相同的 UIButton 添加到 iphone 中的所有视图控制器的导航栏?

如何在所有视图控制器中将自定义 uibarbuttonItem 添加到我的导航项?

如何将导航控制器添加到 xib

从导航控制器设置 rightBarButtonItem