文章目录
  1. 1. 一、控制器找不到的一种情况
    1. 1.1. 一、情况描述:
    2. 1.2. 二、问题出现与描述:
    3. 1.3. 三、宝哥释疑
  2. 2. 二、加载本地h5文件的二级页面,第一次白屏,后面就是正常的 2017-06-06
    1. 2.1. 一、问题描述
    2. 2.2. 二、分析与解决
  3. 3. 三、在Xcode8(以后)中跑iOS7系列真机

一、控制器找不到的一种情况

一、情况描述:

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

文章目录
  1. 1. 一、控制器找不到的一种情况
    1. 1.1. 一、情况描述:
    2. 1.2. 二、问题出现与描述:
    3. 1.3. 三、宝哥释疑
  2. 2. 二、加载本地h5文件的二级页面,第一次白屏,后面就是正常的 2017-06-06
    1. 2.1. 一、问题描述
    2. 2.2. 二、分析与解决
  3. 3. 三、在Xcode8(以后)中跑iOS7系列真机