一、控制器找不到的一种情况
一、情况描述:
tabbar有个商城,它的控制器是个全局变量,名字是mall。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| //------------------------------------------- //TKViewController.m @implementation TKViewController{ //... ... TKShoppingMallViewController *_shoppingMallViewController; //商城 } -(void)viewDidLoad{ [super viewDidLoad]; //... ... //商城 _shoppingMallViewController = [[TKShoppingMallViewController alloc]initWithName:@"mall"]; _shoppingMallViewController.webViewUrl = [[TKNetworkManager shareInstance] getFlastHost:@"MALL_HOME_URL"]; _shoppingMallViewController.statusBarBgColor = [[TKThemeManager shareInstance]getCssRulesetByCssKey:@"Navbar"].navStateBarColor; //... ... self.viewControllers = @[navigationCtrlHome, navigationCtrlHq, _tradeMainViewController, _shoppingMallViewController, account]; //... ... }
|
在首页的一个section要展示商城的列表,点击列表的cell进入商城的二级页面。在这个点击中,我实例化的商城控制器也是mall,是局部变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| //------------------------------------------- //TKHomeTodayHotViewController.m -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //点击后马上还原 [tableView deselectRowAtIndexPath:indexPath animated:YES]; TKShoppingMallViewController *shoppingMallViewController = [[TKShoppingMallViewController alloc]initWithName:@"mall"]; NSString *mallHomeUrl = [[TKNetworkManager shareInstance] getFlastHost:@"MALL_HOME_URL"]; NSArray *mallHomeArray = [mallHomeUrl componentsSeparatedByString:@"#!"]; if (mallHomeArray.count >= 2) { if (_dataArray.count > indexPath.row) { TKHomeTodayHotModel *model = _dataArray[indexPath.row]; NSString *productType = [NSString string]; switch ([model.product_sub_type integerValue]) { //银行理财 case 0: productType = @"bank/detail"; break; // 资管产品 case 2: productType = @"capital/detail"; break; //基金 case 3: productType = @"fund/detail"; break; default: productType = model.product_sub_type; break; } NSString *detailUrl = [NSString stringWithFormat:@"%@#!/%@.html?product_id=%@",mallHomeArray[0], productType, model.product_id]; shoppingMallViewController.webViewUrl = detailUrl; } } //设置状态栏颜色 shoppingMallViewController.statusBarBgColor = [[TKThemeManager shareInstance]getCssRulesetByCssKey:@"Navbar"].navStateBarColor; shoppingMallViewController.hidesBottomBarWhenPushed = YES; [self.navigationController pushViewController:shoppingMallViewController animated:YES]; }
|
然后在这个section的header右侧的【更多】按钮,要切换到tabbar的商城页面。使用的是公司框架的跳转方法:
1 2 3
| -(void)p_moreButtonClick:(UIButton *)button { [[TKAppEngine shareInstance] invokeSwitchPage:@"system/mall" param:nil]; }
|
二、问题出现与描述:
先点击首页商城section的cell,进去后返回到首页,然后再点击【更多】,切换没反应。日志如下:
1 2 3 4 5 6 7
| 2017-06-01 19:05:32:584 TKApp_XDTX_invest[14552:3367791] [DEBUG] 路径:模块从[(null)]切换到[system/mall],参数为:(null) 2017-06-01 19:05:32:586 TKApp_XDTX_invest[14552:3367791] [DEBUG] 控制器:模块从[(null)]切换到[<null>],参数为:(null) 2017-06-01 19:05:32:588 TKApp_XDTX_invest[14552:3367791] [ERROR] 控制器模块[mall],尚未初始化!,请查看跳转的路径是否完整和正确。 2017-06-01 19:05:32:588 TKApp_XDTX_invest[14552:3367791] [DEBUG] 路径:模块从[(null)]切换到[system/mall]完成 2017-06-01 19:05:32:767 TKApp_XDTX_invest[14552:3367791] [INFO] TKQuotePushASClient(tianxia.cindasc.com:9606)---->sendHeart 2017-06-01 19:05:32:768 TKApp_XDTX_invest[14552:3367791] [INFO] TKQuotePushASClient(tianxia.cindasc.com:9606)---->didWriteDataWithTag:0 //... ...
|
但是启动app后直接点击【更多】,是好的。日志如下:
1 2 3 4 5 6
| 2017-06-01 19:07:51:530 TKApp_XDTX_invest[15737:3371732] [DEBUG] 路径:模块从[(null)]切换到[system/mall],参数为:(null) 2017-06-01 19:07:51:531 TKApp_XDTX_invest[15737:3371732] [DEBUG] 控制器:模块从[(null)]切换到[<TKShoppingMallViewController: 0x7ffd7c01a000>],参数为:(null) 2017-06-01 19:07:51:533 TKApp_XDTX_invest[15737:3371732] [DEBUG] 监听系统键盘弹出.......... 2017-06-01 19:07:51:534 TKApp_XDTX_invest[15737:3371732] [DEBUG] 取消监听重置键盘......... 2017-06-01 19:07:51:541 TKApp_XDTX_invest[15737:3371732] [DEBUG] itemSelected:fromItemIndex:0toItemIndex:3............ //... ...
|
对这个框架导致的问题,就得咨询宝哥了。
三、宝哥释疑
出现这个bug,是因为这2个控制器重名导致的。当点击首页【商城】section的cell时,实例化的局部变量、名字同为mall的商城控制器,其实是在内存中拿到了tabbar中的商城控制器,但是变为局部变量了。然后在push时被放进了push栈中;返回后就把这个控制器出栈给释放掉了,导致在用方法[[TKAppEngine shareInstance] invokeSwitchPage:@"system/mall" param:nil];
根据名字去拿这个控制器时,找不到这个控制器了。所以就会有上面的
1
| 控制器模块[mall],尚未初始化!,请查看跳转的路径是否完整和正确
|
日志错误。
最新的框架是支持uuid的了,但是日志中没有找到有关uuid的字段,说明是h5还没有升级,所以只能根据控制器名字去找对象。如果有uuid,则会首先根据uuid去找到这个控制器对象。
所以暂时的解决方法是用
1
| self.tabBarController.selectedIndex = 3;
|
来实现切到tabbar的商城控制器去。
或者还有一种解决方案,就是对这个局部商城控制器取另外一个名字。但是这个(信达)项目因为在后续需要调用一些交互的插件,需要传当前h5控制器名字,并判断是否是对应的h5模块,所以这个方案不适合。
以后升级到有uuid的框架了,遇到这种情况,还是会出现控制器名字找不到的情况,所以即使是相同的h5模块,也不能取同样的名字,只能取另外一个名字。但是有了uuid,框架就会优先用uuid去找到对应的控制器,到那时控制器名字就会显得不那么重要了。
二、加载本地h5文件的二级页面,第一次白屏,后面就是正常的 2017-06-06
一、问题描述
首页广告图,点击后要加载www/m/tj/index.html#!/haxt/haxthabb
,其中,传过来的字段是m/tj/index.html#!/haxt/haxthabb
。会出现第一次进去后是白屏,退出后,第二次以及以后进去都是好的。
二、分析与解决
用Safari
查看h5的页面,页面元素都没有,目测是页面文件都没有加载到。后来找刘权同学不小心说了一句,“这个url后面不是要加.html么?”,一言点醒梦中人,加上去之后就正常了。所以最终的代码改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| if ([model.jump_url hasPrefix:@"m/tj/index.html"]) { TKHAWebViewController *tjViewController = [[TKHAWebViewController alloc]initWithName:@"tj"]; NSLog(@"tjViewController: %@",tjViewController); tjViewController.title = model.image_name; tjViewController.statusBarBgColor = [[TKThemeManager shareInstance]getCssRulesetByCssKey:@"Navbar"].backgroundColor; //解决加载www/m/tj/index.html#!/haxt/haxthabb这个地址时,第一次是白屏,后面才能正常加载的问题 hsj-2017-06-05 NSString *url = @""; if ([model.jump_url hasSuffix:@".html"]) { url = [NSString stringWithFormat:@"www/%@",model.jump_url]; } else { url = [NSString stringWithFormat:@"www/%@.html",model.jump_url]; } tjViewController.webViewUrl = url; tjViewController.webView.frame = [UIScreen mainScreen].applicationFrame; tjViewController.hidesBottomBarWhenPushed = YES; [currentViewController.navigationController pushViewController:tjViewController animated:YES]; }
|
三、在Xcode8(以后)中跑iOS7系列真机
有些项目还需要支持iOS7系列系统,当项目在这个系统出现问题时,就需要调试,之前又没有下载iOS7的模拟器,所以只能考虑真机了。
在Xcode8以后的Xcode
中跑iOS7,会弹出一个框提示不支持iOS7,可通过一下步骤解决:
1、下载(传送门)或者从低版本中找到iOS7的支持文件;
2、把支持文件拖到目录~/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
中;
3、重启Xcode,即可跑iOS7的真机了。
参考自:Xcode8兼容iOS7的解决方法
http://blog.csdn.net/u012265444/article/details/53160755