重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
记录器
创新互联公司是专业的夏县网站建设公司,夏县接单;提供成都做网站、网站制作、成都外贸网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行夏县网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
基于不同的场景提供关于记录的封装、适配。一般分为页面式,流式,自定义式。
记录管理者
管理统计记录数据,包含记录缓存,磁盘存储,上传器。
如何降低数据的丢失率?
两种解决方案:
记录上传的时机
上传时机的选择
从三个方面分析架构设计:整体架构、数据流、反向更新。
View 的功能包含:控件的初始化、设置数据、交互事件代理等。
ViewController 的功能:视图创建与组合、协调逻辑、事件回调处理等,事件回调处理指的是视图层的事件。
业务逻辑处理(预排版)、数据增删改查封装者、线程安全处理。
网络请求、数据解析、增删改查、本地处理逻辑(适配)
数据流包含:网络数据、业务数据、UI数据三部分。
网络数据经过 Engine 层处理加工产生业务数据,业务数据经过 ViewModel 层处理产生UI数据,UI数据会转交给视图控制器控制视图的显示。
用户交互网络刷新等都会导致视图层变化,通过代理方式通知视图控制器。控制器对ViewModel的强引用找到对应ViewModel,然后通过UI数据对业务数据的弱引用找到对应的业务数据同时打上脏标记。最后ViewModel进行数据流的重新驱动,将脏数据重新处理生成新的UI数据更新视图。
本节梳理时长统计实现原理和复杂页面的架构实现思路。
html的引用标签是a标签
主要格式为a href="链接地址,默认为#"名称/a
在所有浏览器中,链接的默认外观是:
未被访问的链接带有下划线而且是蓝色的
已被访问的链接带有下划线而且是紫色的
活动链接带有下划线而且是红色的
有很多人更新xcode会出现app有黑边的情况,这种情况常见,搜索一下也会有很多种解决方法,也好解决,但是如果您是遇到另一种黑边 像加载H5页面或是webview上加载页面,出现px像素缺斤少两的情况,但是你的视图也都是适配屏,改view坐标没有反应的情况下该怎么解决。
下面直接上图:
底下有一条黑边,你的有可能是上面,也可能是下面少了这样的一截,后面我经常排查,就发现了如下的问题。
选 择webview的页面坐标是对的,但是当我选择webview的子视频 UIWebBrowserView的时候发现少了20px,原本没更新xocde的时候,是没这项问题。也不会出现黑边。所以我猜想是UIWebBrowserView这项的位置坐标问题。但是UIWebBrowserView又找不到,因为他是webview的子视图,是一个浏览器显示视图,那么我们就改一下webview的位置试试,发现往上偏移,那么它可能是会上蹿下跳,设置你的webview.opaque=NO; 设置它的颜色是white,或者是clear,就ok了。
为了更好理解使用用tabbar和切换视图,我们创建一个Empty Application。
1、 打开Xcode ,新建项目
2、 创建View Controller
在项目上按花键+N创建新文件,创建 Objective-C class 文件,按Next按钮,subClass 选UIViewController 。勾选上xib选项
以同样方式创建另外三个ViewController ,RedViewController ,GreyViewController,YellowViewController。四个View准备好了。那么Tabbar呢?
3、 创建TabBarController.xib文件,选择创建Empty文件
这时候你发现创建的xib文件是空白的,不用慌,去右下角控件栏中把TabBar Controller拖过来就Ok了。
4、 关联TabBarController.xib ,tabbarAppDelegate这两个文件
在上图中选择File’s Owner,打开Identity Inspector,在Class一栏选择tabbarAppDelegate
这样,我们就可以创建TabBarController.xib 文件指向tabbarAppDelegate 文件的Outlet映射了。
5、 在Xcode中的工具栏的View菜单找到 打开Assistant Editor,使tabbarAppDelegate.h和TabBarController.xib 同时打开。
在xib文件上按住control键,往tabbarAppDelegate.h,创建Outlet.
弹出窗口输入 rootController,点connect。
6、 添加代码
打开tabbarAppDelegate.m,在didFinishLaunchingWithOptions方法中添加代码:
1.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
2. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
3. // Override point for customization after application launch.
4. [[NSBundle mainBundle] loadNibNamed:@"TabBarController" owner:self options:nil];
5. [self.window addSubview:self.rootController.view];
6. self.window.backgroundColor = [UIColor whiteColor];
7. [self.window makeKeyAndVisible];
8. return YES;
7、 往TabBarController.xib上添加Tab Bar Item,
把控件栏上的Tab Bar Item控件往TabBarController.xib上拖拽即可,一个放4个。
8 、关联Tab Bar Item和***ViewController。
选择其中一个Tab Bar Item,在右上角打开Identity Inspector,在Class中选择BlueViewController:
然后,打开Attribute,在NIB Name选择BlueViewController:
其他3个tab item重复类似的操作,选中对应的ViewController,这样在切换Tab标签时,就可以切换到对应的页面。
9、 设置tab item的属性
选中其中一个tab item ,会在右上角的属性栏里看到如下信息
Badge是红色圈圈里面有数字 ,表示有多少条信息的属性
Identifier 是tab item的样式,选custom是自定义,下面的是系统的样式。我选了其中四种。
bar ITem 的title image在custom的样式下能设置。
10 、剩下的3个Tab Item也做类似的设置即可。
现在基本完工,运行看看结果如何。好吧,其实和第一第二个图是一样的`,这里就不放了。
11 、在viewDidLoad方法加Log观察切换View
可以加写日志看看对应的View是什么时候运行的。第一个运行的View是BlueViewController,点击其他的tab项时,加载其他的view,加载一次之后下次点击不再调用viewDidLoad。
1.- (void)viewDidLoad
2. [super viewDidLoad];
3. NSLog(@"BlueViewController");
4. // Do any additional setup after loading the view from its nib.
既然要承载 web 页面,一个原生的 WebView 必不可少。在 iOS 中,目前已经有两款高性能、功能齐全的 web 浏览器,UIWebView (=2.0)和 WKWebView(=7.0)。
当然,两种 web 浏览器选其一即可。网上有很多文章,包括我之前已经发表的博文中,都介绍过这两种浏览器,读者可以根据自己的需要选择。
就目前的情况看,UIWebView 发展了很多年,目前市面上大部分的 web 页面也都支持这样的浏览器,因此很多公司在选择的时候都使用这个,但是,我们知道,WKWebView 有太多改善前者的优点,而且也是苹果官方提倡大家使用的,为了性能,为了更多的特性,建议初次搭建的朋友采用 WKWebView。
为了实现 h5 与 native 之间的互相调用,我们需要在两者之间架一层桥来实现,关于 bridge,之前的文章也有介绍。
bridge 的功能包括:native 调用 h5,h5 回调 native,h5 调用 native,native 回调 h5。
有了 bridge,h5可以使用 native 支持的更多特性,native 可以获取 h5 页面加载的信息,也可以让 web 页面动态执行一些脚本做一些事。
总之,在 web 容器框架中,这个 bridge 还是很有必要的。
嗯,这个是辅助项,做了这一步可以进一步提高 web 容器的加载性能,而且资源缓存到本地后可以做到不依赖网络,提高用户体验。
通常有两种做法,
UIWebView 使用简单,而且现在用户的手机性能也已经不再是页面展示性能的瓶颈,所以,这里介绍的依然采用 UIWebView 作为 web 浏览器。
WebViewJavascriptBridge 是一款非常强大的第三方开源 bridge 库,同时支持 UIWebView 和 WKWebView。
git 地址
NJKWebViewProgress 是一款能使 UIWebview 显示加载进度的第三方开源框架,支持代理协议处理和 progressview 展示两种功能。
git 地址
在点击push下一个页面时,因为各种原因,点一下cell或按钮没有响应,用户可能就多点几下,这时候会打开好几个一样的页面。
这是因为push后的页面有耗时操作或者刚好push到另一个页面时,另一个页面正好在reloadData卡住主线程。造成点击cell时卡住了。
这时,我们可以通过重写导航控制器的方法来解决这个问题。
#import UIKit/UIKit.h
@interfaceNaviViewController : UINavigationController
@end
#import "NaviViewController.h"
@interfaceNaviViewController ()
// 记录push标志
@property(nonatomic,getter=isPushing)BOOLpushing;
@end
@implementationNaviViewController
- (void)viewDidLoad {
[superviewDidLoad];
self.delegate=self;
}
- (void)pushViewController:(UIViewController*)viewControlleranimated:(BOOL)animated {
if(self.pushing==YES) {
NSLog(@"被拦截");
return;
}else{
NSLog(@"push");
self.pushing=YES;
}
[superpushViewController:viewControlleranimated:animated];
}
#pragma mark - UINavigationControllerDelegate
-(void)navigationController:(UINavigationController*)navigationControllerdidShowViewController:(UIViewController*)viewControlleranimated:(BOOL)animated {
self.pushing=NO;
}
@end