optional解析之String, String?, String!

声明变量时,如果使用String? 或者 String!,则该变量的类型都是optional string
两者的区别在于,使用String!声明的变量,在使用的时候,不需要显示的解包;编译器会帮我们强制解包。这也就要求使用者需要确保该变量在引用的时候,必须是非nil值。示例:

1
2
3
4
5
let a:String? = "a"
let b:String! = "b"
let c:String = "c"

print(a!+b+c) //打印abc

需要注意的是,在打印、显示在ui上的时候,系统会自动为optional类型在上Optional(“xxx”)字样,如:

1
2
3
4
5
let a:String? = "a"
let b:String! = "b"
let c:String = "c"

print("\(a)\(b)\(c)") //打印"Optional("a")Optional("b")c\n"

所以,大部分情况下,我们需要显示的解包,才能达到自己想要的效果:

1
2
3
4
5
let a:String? = "a"
let b:String! = "b"
let c:String = "c"

print("\(a!)\(b!)\(c)") //打印"abc\n"

VLC iOS库编译

1.下载源码后,执行 ./buildMobileVLCKit.sh -f -n

  1. contrib目录下的文件修改,需要打patch
    a. 把修改前和修改后的文件,含路径,都拷贝一份,分别放入a、b两个文件夹
    b. 执行命令: diff -uNr a b > 0008-xxxx.patch
    c. 修改contrib/xxx/rule.mak

设置UIWebviewController的导航为透明

‘’‘’
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)

    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
    //如果导航栏有背景色,也需要修改下
    self.navigationController?.navigationBar.barTintColor = UIColor.clearColor()
    self.navigationController?.navigationBar.translucent = true

    for subview in self.view.subviews {
        if subview.isKindOfClass(UIWebView) {
            let webview = subview as! UIWebView
            //webview的y轴起点默认为64
            webview.scrollView.contentInset = UIEdgeInsets(top: -64, left: 0, bottom: 0, right: 0)
        }
    }
}

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)

    self.navigationController?.navigationBar.setBackgroundImage(nil, forBarMetrics: .Default)
    self.navigationController?.navigationBar.shadowImage = nil
    self.navigationController?.navigationBar.translucent = false
}

‘’‘’

NSTimer时应注意避免的坑

title: NSTimer

tags:

  1. NSTimer不生效:非主线程中代码中会遇到
    在我们进行多线程编程时,所有的Source都需要添加到Runloop中才能生效,对于我们的NSTimer当然也需要添加到Runloop中才能生效。如果一个Runloop中没有任何Source的话,会立即退出的。而主线程的Runloop在程序运行时,系统就已经为我们添加了很多Source到Runloop中,所以主线程的Runloop是一直存在。

  2. timer = [NSTimer scheduledTimerWithTimeInterval:0.1 // 10ms

      target:self
    selector:@selector(loop:)
    userInfo:nil
     repeats:YES];
    

rn遇过的那些坑

title: rn遇过的那些坑

tags:RN, React Native

  1. react navigation怎么传递参数到下一界面?怎么传递参数到上一界面
  2. 每个界面都要实现navigationOptions的所有细节?
    //不需要!可以定义一个screen的基类,后续所有界面都基于该基类实现
    //或者在TabNavigator等上实现
  3. 为什么每个页面都要在componentDidMount中拦截android回退按钮事件?
    //不需要!可以定义一个screen的基类,后续所有界面都基于该基类实现
  4. 组件之间通信(4-8 链接:http://www.jianshu.com/p/48df06330967)

子组件调用父组件的方法:子组件要拿到父组件的属性,需要通过this.props方法。每次父组件修改了传入的属性,子组件会收到通知,会自动获取新的属性。

父组件调用子组件的方法:在ReactJS中通过ref属性。该属性类似与给组件起名字。父组件可以通过this.ref.xxx来获取到该组件

  1. 创建不定数View,在return方法中不支持for语句
    (1).采用MAP形式
    (2).采用数组的形式

6 ref 属性

7.网络请求加载Loading框注意的地方
Loading 框采用的是IOS原生封装,在RN页面进行网络请求注意延迟200ms左右
this.timer = setTimeout(()=>{this._fetchData();}, 200);
避免Loading 框在上一页面。

8.关于倒计时问题
产品详情页有倒计时功能,但应用切换到后台后,倒计时开始停止工作,这时候需要重新校准时间。所以需要应用的状态
RN中使用APPState来查看应用状态
通过此接口可以获悉应用在当前处于后台还是前台激活的状态,常用方法和应用场景类似于h5的visibilitychange。
注意该接口要最新版本(2.0+)的 react-native 才能调用。
获取到的应用状态常规有:
active:表示应用处于前台运行状态;
background:表示应用处于后台挂起状态;
inactive:表示过度状态,常规不会发生,可以先忽略
我们可以使用 AppState.addEventListener 和 AppState.removeEventListener 方法来监听、移除应用状态的 change 事件。

swift autolayout的常见错误

如下图,一行中有图标、title、comment、箭头四个元素:

1
|-15-{icon}-15-{title}-15-{comment}-5-'>'-15-|

设置autolayout规则的时候,除了如上图设置了各个元素之间的间距外,还添加了comment和title的最大宽度;但运行的时候发现,如果title、comment字段都非常长,经常偶现icon消失的情况。

故障原因:缺少一条icon宽度的规则,导致icon的宽度被挤成0了….

swift framework的注释

参考链接:http://swifter.tips/documentation/

Swift 采用了一套新的文档注释方法,对于一个简单的方法,我们的文档注释看起来应该是这样的:

1
2
3
4
5
6
7
8
9
10
/**
A demo method

- parameter input: An Int number

- returns: The string represents the input number
*/
func method(input: Int) -> String {
return String(input)
}

在文档注释的块中 (在这里是被 /*…/ 包围的注释),我们需要使用 - parameter 紧接输入参数名的形式来表达对输入参数的说明。如果有多个参数的情况下,我们会需要对应着写多组 - parameter 语句。如果返回值不是 Void 的话,我们还需要写 - returns: 来对返回进行说明。

对于像属性这样的简单的声明,我们直接使用 /// 就可以了:

1
2
3
4
5
6
7
///Homecare颜色定义
public class HCColor : UIColor {
///APP 主色调,用于导航、按钮及重要的文字提醒等 浅蓝
public class func HCMainColor(alpha: CGFloat = default) -> UIColor

....
}

优雅的开发Swift和Objective C混编的Framework

如果你之前没有用Swift和Objective C混合开发,建议看看这篇文档:

Swift and Objective-C in the Same Project
这篇文档很详细的讲解了如何运用Objective C和Swift进行混合开发App和Framework。于是,我们先按照文档来写一个混编的Framework

按照文档一步一步来

,