Ios 在情节提要下添加导航项

Ios 在情节提要下添加导航项,ios,objective-c,storyboard,uibarbuttonitem,Ios,Objective C,Storyboard,Uibarbuttonitem,我有一个使用选项卡栏的项目。选项卡栏中的所有选项卡都具有相同的主导航控制器。在其中一个视图上,我希望有用户可以使用的自定义按钮 我在将这些按钮添加到情节提要并显示它们时遇到问题: 以编程方式添加它们 我的项目是用Objective-C编写的,因此我尝试通过编程方式将它们添加到我的viewController中: self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemIte

我有一个使用选项卡栏的项目。选项卡栏中的所有选项卡都具有相同的主导航控制器。在其中一个视图上,我希望有用户可以使用的自定义按钮

我在将这些按钮添加到情节提要并显示它们时遇到问题:

  • 以编程方式添加它们
  • 我的项目是用Objective-C编写的,因此我尝试通过编程方式将它们添加到我的viewController中:

    self.navigationItem.rightBarButtonItem =  [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                                                                                            target:self
                                                                                            action:@selector(myFriendsView)];
    
    我还尝试使用以下方法添加它们:

    self.navigationController.navigationItem.rightBarButton = ...
    
    因为最初的方法不起作用。我不知道是否需要指向选项卡栏导航控制器的指针来添加按钮。这两种方法都不起作用

  • 在情节提要中添加按钮
  • 我在情节提要中的viewController中添加了一个导航项,然后将按钮拖到其中。您可以看到下面的屏幕截图:

    这种技术的问题是,当我加载代码时,按钮没有出现。我再次认为这可能与UITabBar导航控制器覆盖情节提要有关

  • 将导航控制器添加到情节提要以加载viewController
  • 接下来,我尝试添加一个UINavigationController,然后将我的viewController作为根视图加载。根视图仍然包含导航项和按钮

    这是第一个似乎对我所追求的功能有任何影响的方法。奇怪的是,导航条下面添加了导航项:

    如您所见,它已将导航项添加到导航栏下方,而不是导航栏内部。除按钮位置错误外,此功能正常工作

  • 我尝试过的其他事情:
  • -将UIBarButtonims拖动到情节提要中的导航控制器导航栏中

    结论: 对我来说,这似乎应该是一件容易做到的事情与故事板。我无法理解是什么原因导致此代码无法正常工作,以及为什么苹果会启用在导航栏下添加导航项的功能,而不在情节提要的同一视图中添加导航栏


    如果有人能就如何使用故事板以及如何在使用选项卡栏时向视图控制器添加导航按钮向我提供建议,我将不胜感激。

    非常感谢@matt帮助我思考这个问题

    这是一个有趣的案例,我需要更仔细地思考到底发生了什么才能找到答案——在这个案例中,我需要在评论中得到一些帮助

    问题是我没有将导航项设置在正确的位置。我的应用程序的框架设置如下:

    tabBarController -> viewController -> navigationBar
    
    我最初的方法是尝试在viewController上设置导航项。正如您在上面的框架中看到的,没有要设置的导航项。这就是self.navigationController无法工作的原因

    接下来,我尝试在中添加navigationController以解决此问题:

    tabBarController -> navigationController -> viewController -> navigationBar
    
    这也不起作用,因为导航栏是首先在tabBarController中设置的,因此navigationController不会覆盖它

    这一步是我逻辑上的漏洞。我假设我的代码/故事板有问题,因为导航控制器和我设置的项目没有出现

    问题是我不理解这个问题。在本例中,我们有一个控制tabBar的tabBar控制器。这将控制导航栏。这意味着如果我想访问它,我需要为我们的父视图获取当前的导航控制器。使用self.tabBarController可以轻松完成此操作:

    self.navigationItem.rightBarButtonItem =  [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                                                                                            target:self
                                                                                            action:@selector(myFriendsView)];
    
    解决方案:

    self.tabBarController.navigationItem.rightBarButtonItem = ...;
    

    如你所见,这与我在上述问题中的尝试非常相似。两者都遵循导航项的约定。不同之处在于,在解决方案中,我访问了整个视图的父导航控制器。

    “选项卡栏中的所有选项卡都具有相同的主导航控制器”好的,我们只讨论了问题的第二句话,这已经没有意义了。我想你是说这是一个带有多个子视图控制器的选项卡栏控制器?但是,他们怎么可能都有“相同的导航控制器”?马特,我们有一个主导航控制器,它加载一个视图控制器,它是一个UITABBARC控制器。当我说“它们都有相同的导航控制器”时,我的意思是每个视图没有在情节提要中添加自己的导航控制器。相反,我们将ViewController加载到UITabBar中。我假设这意味着它们共享同一个导航控制器。如果我理解正确,这意味着导航控制器中有一个选项卡栏控制器。这意味着导航控制器只有一个子控制器“共享”它,即选项卡栏控制器。对于导航控制器的状态,不会咨询选项卡栏的子项。这就是为什么您尝试执行的操作不起作用的原因。选项卡栏控制器的子项不在导航界面中(即使它们的祖父是导航控制器)。选项卡栏控制器为。从一个视图控制器切换到另一个视图控制器不会对导航控制器、其导航栏等产生任何影响。我不知道您做了什么使其“工作”,因此您应该承担责任并回答您自己的问题!(完全合法的堆栈溢出;几天后,您甚至可以接受自己的答案。)