一句话笔记,某段时间内遇到或看到的某个可记录的点。 2017-1-10
- 1、拦截UIWebView中的事件,实现webView和native的通信
- 2、隐藏 UIBarButtonItem
- 3、NSDate 初始化的几种对比(时间戳)
一、拦截UIWebView中的事件,实现UIWebView和Native的通信
对于外部的跳转是直接用 iOS Universal Links 或者 URL Scheme ,但实际上我们里面其实也是可以拦截UIWebView中的事件,实现UIWebView和Native的通信的。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString* scheme = [[request URL] scheme];
NSLog(@"scheme = %@",scheme);
return YES;
}
之前一直知道是这样做的,但一直不是特别清晰,今天想了下,实际上就是相当于当 WebView 方法中调用了上面这个方法,返回YES,表示允许,然后就去搜索项目中的 scheme, 看是否符合条件,如果符合就去AppDelegate 中实现相对应的方法。
- 实现上述代理,返回YES,表示允许。(当然代理中可以进行诸多判断,进行事件处理)
- 寻找项目中的 URL Types 中的 URL Schemes (没有,就可以手动设置下)
- 发现 scheme 是OK的,再跑到 AppDelegate 中去实现对应的方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // 对应 URL 实现相对应的跳转,然后就可以走通啦 return YES; }
然后进行对应的事件,就相当于实现UIWebView和Native的通信。
>####二、隐藏 UIBarButtonItem
一开始我在隐藏 UIBarButtonItem 时,就在想为什么它是没有 hidder 属性的,后来通过查看其API 后发现它是 NSObject 的子类,而不是 UIView 的子类。
并且首先我是采取下面这种方法进行隐藏的:
if (hide) {
[self.editCartButtonItem setEnabled:NO];
[self.editCartButtonItem setTintColor:[UIColor clearColor]];
}
else {
[self.editCartButtonItem setEnabled:YES];
[self.editCartButtonItem setTintColor:[UIColor whiteColor]];
}
但是发现有时还是有点小问题的,会有时隐藏不掉,原因是:UIBarButtonItem 的属性 tintColor 设置无效,在使用 enabled 之后。
发现直接用其属性更适宜:
[_editCartButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor clearColor]}
forState:UIControlStateDisabled];
[_editCartButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}
forState:UIControlStateNormal];
self.editCartButtonItem.enabled = !hide;
>####三、NSDate 初始化的几种对比(时间戳)
一直对下面三种常用的初始化,有点傻傻分不清
- (instancetype)date;
- (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs;
- (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;
* + (instancetype)date
NSDate *date = [[NSDate date];
**默认初始化,返回当前时间**
* + (instancetype)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs
[NSDate dateWithTimeIntervalSinceNow:1000];
// 2017-01-10 18:29:04
**以当前时间的偏移秒数来初始化**
* + (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs
[NSDate dateWithTimeIntervalSince1970:1000];
// 1970-01-01 08:16:40
**以GMT时间的偏移秒数来初始化**
另外还有一个初始化的方法:
* + (instancetype)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti
[NSDate dateWithTimeIntervalSinceReferenceDate:1000];
// 2001-01-01 08:16:40
**以2001-1-1 0:0:0的偏移秒数来初始化**
以上都是基于以下NSDateFormatter打印的时间点
- (NSDateFormatter *)formatter {
if (!_formatter) {
_formatter = [[NSDateFormatter alloc] init];
_formatter.locale = [NSLocale currentLocale];
_formatter.timeZone = [NSTimeZone systemTimeZone];
_formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
}
return _formatter;
}
> 一般我们本地显示可以用dateWithTimeIntervalSinceNow 初始化方法;
但是我们统一的时间戳,确实用dateWithTimeIntervalSince1970 统一规定的,**所以,当后台以时间戳的形式返回,我们本地就需要用以上初始化。**
PS:**时间戳的概念:** 一个时间点距离 1970.1.1 的时间间隔,这个时间是以秒为单位,就叫做时间戳。