草庐IT

ios - UINavigationView不能弹出,只有导航弹出动画,UIViewController没变

coder 2024-01-23 原文

我使用自定义 UINavigationController 作为 rootViewController。 UINavigationController 的 第一个 viewController 是一个 UITabBarController。每个 UITabBarController 都是自定义的 UINavigationConller。当显示 tabBarController 时,我隐藏了 rootViewController的 navigationBar.

Init the UITabbarController

+(RDVTabBarController *)tabBarControllertWithIndex:(NSUInteger)index
{
    UIViewController *goodsHomeController = [[ESGoodsHomeViewController alloc] initWithNibName:nil bundle:nil];
    UINavigationController *goodsHomeNavi = [[ESNavigationController alloc]
                                               initWithRootViewController:goodsHomeController];
    ........     
    ESTabBarController *tabBarController = [[ESTabBarController alloc] init]; //对status bar 能定制
    [tabBarController setViewControllers:@[goodsHomeNavi,categoryNavi,shoppingCarNavi,userCenterNavi]];
    return tabBarController;

}

Set it to a navigationController

self.tabController = [UIHelper tabBarControllertWithIndex:0];
self.tableController.delegate = self;
UINavigationController *tabBarNavigation = [UIHelper navigationControllerViewController:self.tableController];
tabBarNavigation.navigationBarHidden = TRUE;
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.rootViewController = tabBarNavigation;

In the baseViewController ,I customise the back item in the navigationBar

- (void)setCustomNavigationBackButton
{
    UIImage *backBtn = [UIImage imageNamed:@"bar_back"];
    UIImage *backDownBtn = [UIImage imageNamed:@"bar_back_down"];
    backBtn = [backBtn imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    backDownBtn = [backDownBtn imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.navigationItem.backBarButtonItem.title=@"";
    self.navigationController.navigationBar.backIndicatorImage = backBtn;
    self.navigationController.navigationBar.backIndicatorTransitionMaskImage = backBtn;
}

In some cases, I change the viewControllers of a navigationController when I push a viewController after the push animation is finished. I use a navigationController+block

- (void)popToViewController:(UIViewController *)viewController animated:(BOOL)animated onCompletion:(void(^)(void))completion
{

    [CATransaction begin];
    [CATransaction setCompletionBlock:completion];
    [self popToViewController:viewController animated:animated];
    [CATransaction commit];

}

完成后 block 被执行

 [UIHelper viewController:self pushViewController:orderDetail completion:^{

        NSMutableArray *afterController = [NSMutableArray array]; //将本页面删除

        NSArray *viewController = self.navigationController.viewControllers;
        [viewController enumerateObjectsUsingBlock:^(UIViewController *obj, NSUInteger idx, BOOL *stop) {

            if (![obj isKindOfClass:[ESPurchaseViewController class]]) {
                [afterController addObject:obj];
            }

        }];

        self.navigationController.viewControllers = afterController;

    }];

在某些推送中,当我从 UITabBarController 推送到 secondViewController 时,我隐藏了 navigationBar 并显示了根 navigationBar

+(void)tabController:(UIViewController *)tabController pushSubController:(UIViewController *)subViewController
{
    [tabController.rdv_tabBarController.navigationController pushViewController:subViewController animated:YES];
    tabController.rdv_tabBarController.navigationController.navigationBarHidden = FALSE;
}

我找不到导航无法弹出的原因。这并不总是发生。 关于UINavigationContller,UITabBarController,UIViewController有什么错误的iOS基础知识让我知道吗? 谢谢!

最佳答案

如果我认为您需要的是第一个 MainNavigationViewController,然后是带有它的 tabbar Controller,并且每个 tab bar 的 View Controller 也有自己的 nvaigation Controller ,那么它将正常工作..

listViewController = [[CBListViewController alloc] initWithStyle:UITableViewStylePlain];
    bookmarkController = [[CBBookmarksViewController alloc] initWithStyle:UITableViewStylePlain];
    settingsController = [[CBActivityViewController alloc] init ];
    searchController = [[CBSearchViewController alloc] initWithNibName:@"CBSearchViewController" bundle:nil];
    nearbyController = [[CBViewOnMapViewController alloc] init ];
   UINavigationController *bNavigationController = [[UINavigationController alloc] initWithRootViewController:bookmarkController];
    self.navigationControllerForBookmark = bNavigationController;

    UITabBarItem *tab2=[[UITabBarItem alloc]init];
    tab2.image = [[UIImage imageNamed:@"bookmark.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    tab2.selectedImage = [[UIImage imageNamed:@"bookmark_active.png"]  imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    tab2.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0);
    navigationControllerForBookmark.tabBarItem = tab2;


    UINavigationController *cNavigationController = [[UINavigationController alloc] initWithRootViewController:settingsController];
    self.navigationControllerForSettings = cNavigationController;

    UITabBarItem *tab3=[[UITabBarItem alloc]init];
    tab3.image = [[UIImage imageNamed:@"activites.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    tab3.selectedImage = [[UIImage imageNamed:@"activites_active.png"]  imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    tab3.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0);
    navigationControllerForSettings.tabBarItem = tab3;


    UINavigationController *dNavigationController = [[UINavigationController alloc] initWithRootViewController:searchController];
    self.navigationControllerForSearch = dNavigationController;

    UITabBarItem *tab4=[[UITabBarItem alloc]init];
    tab4.image = [[UIImage imageNamed:@"Search.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    tab4.selectedImage = [[UIImage imageNamed:@"Search_active.png"]  imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.navigationController.tabBarItem = tab4;
    tab4.imageInsets=UIEdgeInsetsMake(5, 0, -5, 0);
    navigationControllerForSearch.tabBarItem=tab4;

    UINavigationController *eNavigationController = [[UINavigationController alloc] initWithRootViewController:nearbyController];
    self.navigationControllerForNearby = eNavigationController;

    UITabBarItem *tab5=[[UITabBarItem alloc]init];
    tab5.image = [[UIImage imageNamed:@"nearby.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    tab5.selectedImage = [[UIImage imageNamed:@"nearby_active.png"]  imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    self.navigationController.tabBarItem = tab5;
    tab5.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0);
    navigationControllerForNearby.tabBarItem = tab5;

    [navigationControllerForNearby.navigationBar setBackgroundImage:[UIImage imageNamed:@"headerBar"] forBarMetrics:UIBarMetricsDefault];


    UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:listViewController];
    self.navigationController = aNavigationController;


    UITabBarItem *tab1=[[UITabBarItem alloc]init];
    tab1.image = [[UIImage imageNamed:@"review.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    tab1.selectedImage = [[UIImage imageNamed:@"review_active.png"]  imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    tab1.imageInsets = UIEdgeInsetsMake(5, 0, -5, 0);
    navigationController.tabBarItem = tab1;


    [[UITabBar appearance] setBarTintColor:GRAY_COLOR];


    self.tabBarController = [[UITabBarController alloc] init];


    self.tabBarController.viewControllers = [NSArray arrayWithObjects:navigationController, navigationControllerForNearby, navigationControllerForSearch, navigationControllerForBookmark, navigationControllerForSettings, nil];

 self.window.rootViewController = self.tabBarController;

检查这是否解决了您的问题,先生。

关于ios - UINavigationView不能弹出,只有导航弹出动画,UIViewController没变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32430751/

有关ios - UINavigationView不能弹出,只有导航弹出动画,UIViewController没变的更多相关文章

  1. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  4. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  7. ruby-on-rails - 只有当不是 nil 时才执行映射? - 2

    如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e

  8. ruby-on-rails - Ruby rand() 不能接受变量? - 2

    我对此有点困惑。我在RoR项目中的最终目标是从我的数据库中获取单个随机配置文件。我想它应该是这样的:@profile=Profile.find_by_user_id(rand(User.count))它一直抛出错误,因为user_id0不存在,所以我把它的一部分拿出来检查发生了什么:@r=rand(User.count)每次都返回0。发生什么了?我注册了5个假用户和5个相关配置文件来测试这个。如果我将Profile.find_by_user_id(rand(User.count))重写为Profile.find_by_user_id(3)它工作得很好。User.count也在工作。所以

  9. ruby - 为什么我不能从 ruby​​ 中的选定键创建新的散列? - 2

    这个问题困扰了我一段时间。这不是一件困难的事情,但我不知道为什么没有简单的方法来做到这一点,我敢打赌有但我没有看到。我只想取一个散列,像这样:cars={:bob=>'Pontiac',:fred=>'Chrysler',:lisa=>'Cadillac',:mary=>'Jaguar'}然后做类似的事情cars[:bob,:lisa]得到{:bob=>'Pontiac',:lisa=>'Cadillac'}我这样做了,效果很好:classHashdefpick(*keys)Hash[select{|k,v|keys.include?(k)}]endendruby-1.8.7-p249

  10. ruby-on-rails - 为什么 Rails 可以使用 `if` 作为哈希键但在 Ruby 中不能 - 2

    在纯Rubyirb中,不能输入{if:1}。该语句不会终止,因为irb认为if不是符号,而是if语句的开始。那么为什么Rails可以有before_filter接受if作为参数?该指南的代码如下:classOrderunless也会发生同样的事情。 最佳答案 这是一个irb问题,而不是Ruby。bash=>ruby-e"puts({if:1})"bash=#{:if=>1}您可以改用pry。它将正确读取输入。https://github.com/pry/pry 关于ruby-on-rai

随机推荐