推荐内容IMESSGAE相关
作者推荐内容 | iMessage苹果推软件 *** 点击即可查看作者要求内容信息 |
---|---|
作者推荐内容 | 1.家庭推内容 *** 点击即可查看作者要求内容信息 |
作者推荐内容 | 2.相册推 *** 点击即可查看作者要求内容信息 |
作者推荐内容 | 3.日历推 *** 点击即可查看作者要求内容信息 |
作者推荐内容 | 4.虚拟机安装简单 *** 点击即可查看作者要求内容信息 |
作者推荐内容 | 5.iMessage *** 点击即可查看作者要求内容信息 |
NSCopy协定是对工具举行拷贝的协议。Copy后的对象和原对象是两个对象,要分隔斟酌其生命周期。Copy后的对象理当对原始对象不依赖,不影响。 利用NSCopy协议只必要实现一个法子copyWithZone:便可 举例 OC @interface MyModel:NSObject @property (copy,nonatomic)NSString * name; @property (nonatomic)int age; @end @implementation MyModel -(instancetype)copyWithZone:(NSZone *)zone{ MyModel * copyedModel
[[self.class allocWithZone:zone] init]; copyedModel->_name = self.name; copyedModel->_age = self.age; return copyedModel; } @end 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 使用 MyModel * model = [[MyModel alloc] init]; model.name = @“wenchen”; model.age = 24; MyModel * copyedModel = [model copy]; 1 2 3 4 而后在LLDB中能够检察对象地点,可以看到是两个自力的对象 (lldb) po copyedModel (lldb) po model 1 2 3 4 5 Swift class MyModel:NSObject,NSCopying{ func copyWithZone(zone: NSZone) -> AnyObject { let copyedModel = self.dynamicType() return copyedModel } required override init() { } 1 2 3 4const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: ‘white’, justifyContent: ‘center’, }, blackText:{ fontSize:20, color:‘rgb(0,0,0)’, backgroundColor:‘rgba(255,255,255,0)’, textAlign:‘center’, marginLeft:10, }, }); AppRegistry.registerComponent(‘LeoRNWeather’, () => LeoRNWeather); 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 结果 增加导航栏 这里提一下,在React Native中,导航栏有两种 Navigator,大部分的环境下使用这个,由facebook的react native团队进行开辟,不停在保护,同时支撑iOS和安卓,由于在导航切换的时辰需要进行大量的加载,以是会占用JS线程较多时候。
NavigatorIOS,很少使用,由开源社区开发,有不少bug,仅仅支持iOS。可是外部由原生的UINavigationController实现,所以现实运转的时候,和原生的iOS导航同样,有一样的动画 本文使用NavigatorIOS,react native的相干材料还不是很多,必定要会看英文文档,NavigationIOS的文档可以在这里找到 在顶部import引入 NavigatorIOS, 1 然后,重写LeoRNWeather,增长导航栏,此中 initialRoute 界说最后的页面,雷同iOS中的rootViewController,title暗示题目,component表示衬着的对象,是Component的子类 var LeoRNWeather = React.createClass({ render: function() { return ( ); } }); 1 2 3 4 5 6 7 8 9 10 11 12 13 建立ListScreen var ListScreen = React.createClass({ render(){ return ( blog.csdn.net/hello_hwc ); } }); 1 2 3 4 5 6 7 8 9 然后, Save,挑选模拟器,command+R革新,可以看到效果(点窜了笔墨) 添加背景图 起首,在目次里添加一张图片 Tips:当向iOS工程中Images.xcassets添加了图片大概android添加了res/drawable添加图片的时候,需要从新编译 然后,将index.ios.js修改成如下 import React, { AppRegistry, Component, StyleSheet, View, ListView, Text, NavigatorIOS, Image, } from ‘react-native’; var ListScreen = React.createClass({ render(){ return ( blog.csdn.net/hello_hwc ); } }); var LeoRNWeather = React.createClass({ render: function() { return ( ); } }); const styles = StyleSheet.create({ backgroundImg:{ flex:1, width: null, height: null, flexDirection: ‘row’, justifyContent: ‘center’, alignItems: ‘center’, }, whiteText:{ fontSize:20, color:‘rgb(255,255,255)’, backgroundColor:‘rgba(255,255,255,0)’, textAlign:‘left’, marginLeft:10, }, container: { flex: 1, backgroundColor: ‘white’, justifyContent: ‘center’, }, blackText:{ fontSize:20, color:‘rgb(0,0,0)’, backgroundColor:‘rgba(255,255,255,0)’, textAlign:‘center’, marginLeft:10, }, }); AppRegistry.registerComponent(‘LeoRNWeather’, () => LeoRNWeather); Tips 经由过程配置flex为1来让宽度高度添补100%,通过height,width为null
来让Image填充屏幕 通过设置父视图的alignItems:‘center’ flexDirection:'column’来设置程度居,alignItems:‘center’ flexDirection:'row’来设置垂直居中 对于Flexbox结构,可以参考这片文章,写的很是细致 进行收集哀求 React Native网络请求的文档可以在这里找到,在React中,网络请求使用Fetch, 比方,你可以如许去挪用一个POST请求 fetch(‘https://mywebsite.com/endpoint/’, { method: ‘POST’, headers: { ‘Accept’: ‘application/json’, ‘Content-Type’: ‘application/json’, }, body: JSON.stringify({ firstParam: ‘yourValue’, secondParam: ‘yourOtherValue’, }) }) 由于网络请求是一个异步的请求,所以,它返回的是一个Promise对象,对付这个对象,有两种处置方式 同步处理then和catch 异步处理,async/await 另有一个API是XMLHttpRequest,它是创建在iOS网络请求api之上的,本文不做会商。 由于本文是这个React Native系列的第一篇,所以处理方式采纳同步处理。简略间接。 在类ListScreen中,添加如下两个方法 //Component挂载终了后调用 componentDidMount() { this.fetchData(); }, fetchData() { fetch(REQUEST_URL) .then((response) => response.json()) .then((responseData) => { }) .done(); },
这里的REQUEST_URL是一个全局变量 var REQUEST_URL = ‘https://raw.githubusercontent.com/LeoMobileDeveloper/React-Native-Files/master/person.json’; 1 2 然后,save,command+R刷新模拟器,会发明Log如下 2016-04-21 13:53:49.563 [info][tid:com.facebook.React.JavaScript] [ { nickname: ‘Leo’, realname: ‘WenchenHuang’ }, { nickname: ‘Jack’, realname: ‘SomethingElse’ } ] 1 2 为了表现到ListView中,咱们要把网络请求来的数据存储下来,为ListScreen添加如下方法 用loaded来果断网络数据是不是加载完毕 用users来存储实际的的网络数据,这里因为users是ListView的dataSource,所以用ListView的DataSource来初始化 //主动调用一次,用来设置this.state的初始状况 getInitialState: function() { return { loaded: false, users: new ListView.DataSource({ rowHasChanged: (row1, row2) => row1 !== row2, }), }; }, 1 2 3 4 5 6 7 8 9 然后修改fetchData方法,在加载完毕后保留数据 fetchData() { fetch(REQUEST_URL) .then((response) => response.json()) .then((responseData) => { this.setState({ users: this.state.users.cloneWithRows(responseData), loaded: true, }); }) .done(); }, 1 2 3 4 5 6 7 8 9 10 11 Tips:this.setState会触发render重新调用,进行重绘 写出一个列表 挪动开发中,列表是一个非常经常使用的控件。(iOS中的Tableview,android中的listview)。 ListView的文档链接 ListView的长处是,当视图分开屏幕的时候,会被复用或者移除,低落内存使用。关于ListVIew,ReactNative团队进行了很多优化,好比event-loop只渲染一个cell,将渲染事情分红很多个小的碎片实行,来防备掉帧。 若何使用ListView 起码需要以下两个 dataSource,一个简单数组来描写MVC中的model,类似于iOS中的dataSource renderRow,返回一个视图组建.类似于iOS中的cellForRowAtIndexPath renderSeparator,一样平常也需要这个方法,来讲天生一个分隔线 固然,listView也支持很多,比如像iOS那样的section header,header,footer,以及很多的变乱回调,在listView的文档里,你都可以找到。 这时的ListScreen类如下 var ListScreen = React.createClass({ getInitialState: function() { return { loaded: false, users: new ListView.DataSource({ rowHasChanged: (row1, row2) => row1 !==
row2, }), }; }, componentDidMount() { this.fetchData(); }, fetchData() { fetch(REQUEST_URL) .then((response) => response.json()) .then((responseData) => { this.setState({ users: this.state.users.cloneWithRows(responseData), loaded: true, }); }) .done(); }, render(){ if (!this.state.loaded) { return this.renderLoadingView() } return this.renderList() }, renderLoadingView() { return ( ); }, renderList(){ return ( } /> ); }, renderRow(user){ return ( this.rowClicked(user)} underlayColor = ‘#ddd’> {user.nickname} {user.realname} ); }, rowClicked(user){ console.log(user); }, }); 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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 Styles如下 const styles = StyleSheet.create
({ backgroundImg:{ flex:1, width: null, height: null, flexDirection: ‘row’ }, backgroundLoading:{ flex:1, width: null, height: null, alignItems: ‘center’, justifyContent: ‘center’, flexDirection: ‘row’ }, thumbnail: { width: 60, height: 60, }, rightCongtainer:{ flex:1, }, fullList:{ flex:1, paddingTop: 64, }, separator: { height: 0.5, backgroundColor: ‘rgba(255,255,255,0.5)’, }, centering: { alignItems: ‘center’, justifyContent: ‘center’, }, whiteText:{ fontSize:20, color:‘rgb(255,255,255)’, backgroundColor:‘rgba(255,255,255,0)’, textAlign:‘left’, marginLeft:10, }, blackText:{ fontSize:20, color:‘rgb(0,0,0)’, backgroundColor:‘rgba(255,255,255,0)’, textAlign:‘center’, marginLeft:10, }, container: { flex: 1, backgroundColor: ‘white’, justifyContent: ‘center’, }, }); 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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 这时候,save,command+R后,发现再网络请求的时候会先显示小菊花转转转,然后加载完毕以后,显示一个List 加载Spinner(仅合用于iOS) 这个在下面的代码中提到了 renderLoadingView() { return ( ); }, 1 2 3 4 5 6 7 8 9 10 11 控制台打印 上文的代码里提到 rowClicked(user){ console.log(user); }, 1 2 3 使用console.log来实现控制台 这时候,我们在点击某一行,会看到XCode中输出 在Chrome中调试 使用Command+control+Z来调出调试窗口,然后选择Debug in chrome 这时候,App会和Chrome建立一个socket毗连,这样在Chrome中就可以进行调试了。 翻开Chrome开发者东西 点击某一行,就会发现在chrome的控制台进行log了 添加一个详情页,而且传值 新建一个Component来表示详情页 var DetailScreen = React.createClass({ render(){ return ( {this.props.user.nickname} {this.props.user.realname} ); } }); 1 2 3 4 5 6 7 8 9 10 然后,在rowClick中,跳转到详情页 rowClicked(user){ console.log(user); this.props.navigator.push(
{ title: “详情页”, component: DetailScreen, passProps: {user:user}, }); }, 1 2 3 4 5 6 7 8 Tips: NavigatorIOS可以通过this.props.navigator来访问 通过 this.props.navigator.push来跳转,通过passProps: {user:user}来通报值 每一个Component的类都有两个全独享,this.props表示参数,this.state表示以后的状态。可以用来存储和传递数据 简单提一下React Native的机能 在RN中,重要有两个线程 JavaScript线程 主线程(UI线程) 其中,JavaScript是React Native的JS代码执行线程,React Native的触摸处理,网络请求,视图设置装备摆设,以及app的营业逻辑都是产生在这里的。主线程是实际原生代码绘制视图的执行线程。使用React Native的时候,每每会碰到JavaScript线程执行逻辑过量,没有法子实时相应UI线程,致使掉帧.所以,React Native的性能,较纯原生的仍是要差一些的 后续 React Native实战剖析(中)会继承讲授一些底子控件的适用,然后也会写一个demo的app,React Native实战解析(下)会写一个相对于美满点的利用,作为这个入门系列的闭幕。然后,筹划写一两篇夹杂编程的,近来比较忙,这个系列渐渐更新吧 附录,终极的index.ios.js全数代码 /** * Sample React Native App * https://github.com/facebook/react-native */ import React, { AppRegistry, Component, StyleSheet, ListView, Text, View, Image, ActivityIndicatorIOS, Navigator, TouchableHighlight, TouchableOpacity, NavigatorIOS, } from ‘react-native’; var REQUEST_URL = ‘https://raw.githubusercontent.com/LeoMobileDeveloper/React-Native-Files/master/person.json’; var ListScreen = React.createClass({ getInitialState: function() { return { loaded: false, users: new ListView.DataSource({ rowHasChanged: (row1, row2) => row1 !== row2, }), }; }, componentDidMount() { this.fetchData(); }, fetchData() { fetch(REQUEST_URL) .then((response)
=> response.json()) .then((responseData) => { this.setState({ users: this.state.users.cloneWithRows(responseData), loaded: true, }); }) .done(); }, render(){ if (!this.state.loaded) { return this.renderLoadingView() } return this.renderList() }, renderLoadingView() { return ( ); }, renderList(){ return ( } /> ); }, renderRow(user){ return ( this.rowClicked(user)} underlayColor = ‘#ddd’> {user.nickname} {user.realname} ); }, rowClicked(user){ console.log(user); this.props.navigator.push({ title: “详情页”, component: DetailScreen, passProps: {user:user}, }); }, }); var DetailScreen = React.createClass({ render(){ return ( {this.props.user.nickname} {this.props.user.realname} ); } }); var LeoRNWeather = React.createClass({ render: function() { return ( ); } }); const styles = StyleSheet.create({ backgroundImg:{ flex:1, width: null, height: null, flexDirection: ‘row’ }, backgroundLoading:{ flex:1, width: null, height: null, alignItems: ‘center’, justifyContent: ‘center’, flexDirection: ‘row’ }, thumbnail: { width: 60, height: 60, }, rightCongtainer:{ flex:1, }, fullList:{ flex:1, paddingTop: 64, }, separator: { height: 0.5, backgroundColor: ‘rgba(255,255,255,0.5)’, }, centering: { alignItems: ‘center’, justifyContent: ‘center’, }, whiteText:{ fontSize:20, color:‘rgb(255,255,255)’, backgroundColor:‘rgba(255,255,255,0)’, textAlign:‘left’, marginLeft:10, }, blackText:{ fontSize:20, color:‘rgb(0,0,0)’, backgroundColor:‘rgba(255,255,255,0)’, textAlign:‘center’, marginLeft:10, }, container: { flex: 1, backgroundColor: ‘white’, justifyContent: ‘center’, }, }); 5 6 7 8 简单测试 let model1 = MyModel() let model2 = model1.copy() 1 2 (lldb) po model1 (lldb) po model2 1 2 3 4 5 6 这里趁便提一下,如何在Swift中声明一个OC中的copy 属性