From 3070f114605b1ae81b3ebea746f51fd548d4ac2e Mon Sep 17 00:00:00 2001 From: wushenghua Date: Tue, 23 Feb 2016 15:35:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BE=88=E5=A4=9A=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Collect.js | 233 ++++++++++++++++++ Info.js | 155 +++++++----- MyListView.js | 214 ++++++++++++++++ MyListViewDemo.js | 149 +++++++++++ RandPage.js | 2 +- home.js | 22 +- index.ios.js | 10 +- ios/Podfile | 3 + ios/Podfile.lock | 15 ++ ios/testdemo.xcodeproj/project.pbxproj | 157 +++++++++++- .../contents.xcworkspacedata | 10 + .../Class/ASHUIMenuControllerManager.h | 14 ++ .../Class/ASHUIMenuControllerManager.m | 78 ++++++ ios/testdemo/Class/ASHUtilManager.h | 14 ++ ios/testdemo/Class/ASHUtilManager.m | 21 ++ ios/testdemo/Class/MessageInfo.h | 21 ++ ios/testdemo/Class/MessageInfo.m | 28 +++ ios/testdemo/Class/MessageInfoManager.h | 14 ++ ios/testdemo/Class/MessageInfoManager.m | 65 +++++ .../Class/UIViewController+Category.h | 14 ++ .../Class/UIViewController+Category.m | 38 +++ lib/ControlledRefreshableListView.js | 186 -------------- lib/ListView.js | 3 - lib/MainNavigator.js | 202 +++++++++++++++ lib/MainTabBar.js | 98 ++++++++ lib/RefreshableListView.js | 82 ------ lib/RefreshingIndicator.js | 63 ----- lib/createElementFrom.js | 16 -- lib/delay.js | 5 - 29 files changed, 1504 insertions(+), 428 deletions(-) create mode 100644 Collect.js create mode 100644 MyListView.js create mode 100644 MyListViewDemo.js create mode 100644 ios/Podfile create mode 100644 ios/Podfile.lock create mode 100644 ios/testdemo.xcworkspace/contents.xcworkspacedata create mode 100644 ios/testdemo/Class/ASHUIMenuControllerManager.h create mode 100644 ios/testdemo/Class/ASHUIMenuControllerManager.m create mode 100644 ios/testdemo/Class/ASHUtilManager.h create mode 100644 ios/testdemo/Class/ASHUtilManager.m create mode 100644 ios/testdemo/Class/MessageInfo.h create mode 100644 ios/testdemo/Class/MessageInfo.m create mode 100644 ios/testdemo/Class/MessageInfoManager.h create mode 100644 ios/testdemo/Class/MessageInfoManager.m create mode 100644 ios/testdemo/Class/UIViewController+Category.h create mode 100644 ios/testdemo/Class/UIViewController+Category.m delete mode 100644 lib/ControlledRefreshableListView.js delete mode 100644 lib/ListView.js create mode 100644 lib/MainNavigator.js create mode 100644 lib/MainTabBar.js delete mode 100644 lib/RefreshableListView.js delete mode 100644 lib/RefreshingIndicator.js delete mode 100644 lib/createElementFrom.js delete mode 100644 lib/delay.js diff --git a/Collect.js b/Collect.js new file mode 100644 index 0000000..7b5d54f --- /dev/null +++ b/Collect.js @@ -0,0 +1,233 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + */ +'use strict'; +import React, { + AppRegistry, + Component, + StyleSheet, + ListView, + Text, + View, + Image, + TouchableOpacity, + AlertIOS, + RefreshControl, + ActivityIndicatorIOS +} from 'react-native'; + + +import InfoPage from './Info.js' +var MessageInfoManager = require('react-native').NativeModules.MessageInfoManager; +var REQUEST_URL = 'http://127.0.0.1:3000/users/list'; +var MOCKED_MOVIES_DATA = [ + {title: 'Title', year: '2015', posters: {thumbnail: 'http://i.imgur.com/UePbdph.jpg'}}, +]; + +const shareImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAACIlBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8xtw6+AAAAtXRSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGhscHR4fICEiIyQlJicqKywuLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0lKS0xNTk9QUVJUVVdYWVxeX2FiY2RmZ2hpa2xtb3Bxc3R1d3h7f4CCg4WGiImLjI6PkZKUlZeYmpudnqCio6WmqKqrra+wsrS1t7m6vL7AwcPFx8jKzM7P0dPV19na3N7g4uTm6Onr7e/x8/X3+fv909B6DgAADGpJREFUeNrtXftfE8cWn2yAxPIKLxW41JqI6CU8Lg1cUQpYleKt9sa01+oVpbZqtfVVERVQtBaNPGpFEFQ0FBUqUBQM+/9dgt6PSjOzZ3YHMmeX7+9zMt+T3dkzZ875DiHooSS7qxtbg32hifBEqC/Y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'; + +var CollectPage = React.createClass({ +getInitialState: function() { + console.log('getInitialState'); + return { + + isLoading: false, + isLoadingFail: true, + dataSource: new ListView.DataSource({ + rowHasChanged: (row1, row2) => row1 !== row2, + }), + filter: '', + queryNumber: 0, + }; + }, + + pushPage:function() { + this.props.navigator.push({ + title: 'New Page', + component: + }); + }, + componentDidMount:function(){ + console.log('componentDidMount'); + this.props.navComponent.setNavItems({ + title: { + component: ( + + 收藏 + + ), + event: function() { + this.fetchData(); + }.bind(this) + } + }), + this.fetchData(); + }, + + onRefresh:function() { + this.fetchData(); + }, +//数据查询. + fetchData:function(){ + this.setState({isLoading:true}); + MessageInfoManager.getMessageArrWithCallBack((err,responseData)=>{ + if (err) { + // AlertIOS.alert('没有数据'); + }else{ + if(responseData){ + this.setState({ + dataSource: this.state.dataSource.cloneWithRows(responseData), + loaded: true, + isLoading: false, + isLoadingFail: false, + }); + console.log('CES'+this.state.dataSource); + + }else{ + this.setState({ + loaded: false, + isLoading: false, + isLoadingFail,true, + }); + } + } + }); + }, + + render:function(){ + // return this.renderLoadingView(); + + if (!this.state.loaded) { + return this.renderLoadingView(); + } + + return ( + } + style={styles.listView}/> + ); + }, + pushInfo:function(index){ + console.log(this.state.dataSource.getRowData(0,index)) + + this.props.navigator.push({ + title: 'New Page', + component: + }); + }, + renderLoadingView:function(){ + if (!this.state.isLoadingFail) { + return ( + this.fetchData()} style={styles.container} > + + + {'点击刷新'} + + + + ); + }else{ + return( + + + {'正在刷新'} + + + + ) + } + }, + renderMovieRow:function(sectionID, rowID, adjacentRowHighlighted){ + return ( + + + + ); + }, + + renderMovie:function(movie,sectionID, rowID, highlightRow){ + return ( + + + this.pushInfo(rowID)} style={styles.container} > + + + {movie.title} + + + + ); + } +}); + +const styles = StyleSheet.create({ + container: { + flex:2, + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + backgroundColor: 'White', + }, + welcome: { + fontSize: 20, + textAlign: 'center', + margin: 10, + }, + instructions: { + textAlign: 'center', + color: '#333333', + marginBottom: 5, + }, + title: { + fontSize: 15, + marginBottom: 8, + marginTop: 10, + marginLeft: 4, + marginRight: 4, + textAlign: 'left', + }, + year: { + textAlign: 'center', + }, + rightContainer: { + flex: 1, + }, + topContainer:{ + flex:1, + height : 30, + backgroundColor: 'LightGray', + }, + thumbnail: { + width: 400, + height: 200, + }, + listView: { + paddingTop: 0, + marginBottom: 44, + backgroundColor: 'LightGray', + }, + navItem: { + flex: 1, + justifyContent: 'center', + alignItems: 'center' + }, + // top{ + // height:60, + // flex: 1, + // }, +}); + +module.exports = CollectPage; diff --git a/Info.js b/Info.js index e050a35..41a0ee3 100644 --- a/Info.js +++ b/Info.js @@ -9,64 +9,53 @@ import React, { View, Image, TouchableOpacity, + TouchableWithoutFeedback, AlertIOS, ActivityIndicatorIOS, + ActionSheetIOS, SegmentedControlIOS, + CameraRoll, + Clipboard, + } from 'react-native'; -import Storage from 'react-native-storage'; - +var MessageInfoManager = require('react-native').NativeModules.MessageInfoManager; +var ASHUIMenuControllerManager = require('react-native').NativeModules.ASHUIMenuControllerManager; +var ASHUtilManager = require('react-native').NativeModules.ASHUtilManager; const shareImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAACIlBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8xtw6+AAAAtXRSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGhscHR4fICEiIyQlJicqKywuLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0lKS0xNTk9QUVJUVVdYWVxeX2FiY2RmZ2hpa2xtb3Bxc3R1d3h7f4CCg4WGiImLjI6PkZKUlZeYmpudnqCio6WmqKqrra+wsrS1t7m6vL7AwcPFx8jKzM7P0dPV19na3N7g4uTm6Onr7e/x8/X3+fv909B6DgAADGpJREFUeNrtXftfE8cWn2yAxPIKLxW41JqI6CU8Lg1cUQpYleKt9sa01+oVpbZqtfVVERVQtBaNPGpFEFQ0FBUqUBQM+/9dgt6PSjOzZ3YHMmeX7+9zMt+T3dkzZ875DiHooSS7qxtbg32hifBEqC/Y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'; const arrowImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAABa1BMVEUAAAD8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwPj53TrAAAAeHRSTlMAAQIDBAUHCAkKCwwOEBEUFRYXGRoeHyAhIiMkJSYnKCkqKywtLi8wMTIzNzg5PD9AQkNFR0lNUFFSVFVbXV5iY2RmZ294eXt8gIKDhYaIiYuMjo+RkpSVl5iam52eoqivtLW3vsPFyMzP09ze4ubp7e/x8/X5+/2lMJsqAAACwklEQVR42u3d2U5TYRiF4dXJYhVUFKkgalWUKs4KzjhbB6SOSKkDdcCxINLyXb4HoqlwYoiJSde77uB5D3Z2/v0nW2KMMcYYY4wxxhhjjDHGGGP/bx3HX9Qjol45us6Rny3F7y3dyNj5C4vRuvkeM/9orNwxK/9QrN5pI//GRngXqERYF9gc4V1gLMwLfAzvAskI7wIdYV6gK8wL5MK8QDrcC8y5F7gd5gUGwr3AO/cC+XAvcNW+wHP3AokqBShAAfsC0xSggH2BCgUoQAH7AlMUoAAF7AtwPkABClBgkgIUsC/wjAL2X0woQIGnFKCAfYEnFKAABewLPKaAfYFHFKAABewLPKQABShgX6BMAQrYF5igAAXsCzygAAXsC4xTgAIUsC9wnwIUoIB9gXsUsC9wlwIUsC9whwJrK5DpP3L2YlvsSmMNBYozYbY/CnS/D7+1FBhuRjgXOBOmO/zT3+fqj+YWSUp/sw0QnxOSrofxTknppnOAOWkwrLfpr94b23ijeuMd4Ja+egeY1oJ3gFea9Q4wrqp3gGsa8Q5QUKd3gJRUc/aXJW11DpCTpJKv/7IkKfHa1T+1fCKUMi1QS/46E0uUvP2SttW8/ZI6R6qzC8b+dlpPA7+zfzt+/Mb+Xvz48eN39TfxO/vz+K39O/Bb+/vw48ePH7+lvx8/fmP/TvzW/oEl/Pjx48fv6N+FH7+xfzd+/Mb+PfjxG/sL+PHjt/XvxY/f2L8Pv7c/8Dv79+O39g/it/YfwI8fP35T/0H8+I39Q/h5/hv7u83vf2bq3n7dNPfnzP06b+7XW3N/0tyvrLlfXeZ+bTD3K2Pul76b+1U296to7lfii7dfGjb3S5PmfiVX//ZtxskvpV6u8E8kZLYLiy38+ZPyW+bSp2X+h3MpeW59/tCJYm9WjDHGGGOMMcYYY4wxxhhjjP2r/QD5wMmbST2PxgAAAABJRU5ErkJggg=='; const base64Icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAQAAACSR7JhAAADtUlEQVR4Ac3YA2Bj6QLH0XPT1Fzbtm29tW3btm3bfLZtv7e2ObZnms7d8Uw098tuetPzrxv8wiISrtVudrG2JXQZ4VOv+qUfmqCGGl1mqLhoA52oZlb0mrjsnhKpgeUNEs91Z0pd1kvihA3ULGVHiQO2narKSHKkEMulm9VgUyE60s1aWoMQUbpZOWE+kaqs4eLEjdIlZTcFZB0ndc1+lhB1lZrIuk5P2aib1NBpZaL+JaOGIt0ls47SKzLC7CqrlGF6RZ09HGoNy1lYl2aRSWL5GuzqWU1KafRdoRp0iOQEiDzgZPnG6DbldcomadViflnl/cL93tOoVbsOLVM2jylvdWjXolWX1hmfZbGR/wjypDjFLSZIRov09BgYmtUqPQPlQrPapecLgTIy0jMgPKtTeob2zWtrGH3xvjUkPCtNg/tm1rjwrMa+mdUkPd3hWbH0jArPGiU9ufCsNNWFZ40wpwn+62/66R2RUtoso1OB34tnLOcy7YB1fUdc9e0q3yru8PGM773vXsuZ5YIZX+5xmHwHGVvlrGPN6ZSiP1smOsMMde40wKv2VmwPPVXNut4sVpUreZiLBHi0qln/VQeI/LTMYXpsJtFiclUN+5HVZazim+Ky+7sAvxWnvjXrJFneVtLWLyPJu9K3cXLWeOlbMTlrIelbMDlrLenrjEQOtIF+fuI9xRp9ZBFp6+b6WT8RrxEpdK64BuvHgDk+vUy+b5hYk6zfyfs051gRoNO1usU12WWRWL73/MMEy9pMi9qIrR4ZpV16Rrvduxazmy1FSvuFXRkqTnE7m2kdb5U8xGjLw/spRr1uTov4uOgQE+0N/DvFrG/Jt7i/FzwxbA9kDanhf2w+t4V97G8lrT7wc08aA2QNUkuTfW/KimT01wdlfK4yEw030VfT0RtZbzjeMprNq8m8tnSTASrTLti64oBNdpmMQm0eEwvfPwRbUBywG5TzjPCsdwk3IeAXjQblLCoXnDVeoAz6SfJNk5TTzytCNZk/POtTSV40NwOFWzw86wNJRpubpXsn60NJFlHeqlYRbslqZm2jnEZ3qcSKgm0kTli3zZVS7y/iivZTweYXJ26Y+RTbV1zh3hYkgyFGSTKPfRVbRqWWVReaxYeSLarYv1Qqsmh1s95S7G+eEWK0f3jYKTbV6bOwepjfhtafsvUsqrQvrGC8YhmnO9cSCk3yuY984F1vesdHYhWJ5FvASlacshUsajFt2mUM9pqzvKGcyNJW0arTKN1GGGzQlH0tXwLDgQTurS8eIQAAAABJRU5ErkJggg=='; + var BUTTONS = [ + 'Option 0', + 'Option 1', + 'Option 2', + 'Delete', + 'Cancel', +]; +var DESTRUCTIVE_INDEX = 3; +var CANCEL_INDEX = 4; -var storage = new Storage({ - //最大容量,默认值1000条数据循环存储 - size: 1000, - - //数据过期时间,默认一整天(1000 * 3600 * 24秒) - defaultExpires: 1000 * 3600 * 24, - - //读写时在内存中缓存数据。默认启用。 - enableCache: true, - - //如果storage中没有相应数据,或数据已过期, - //则会调用相应的sync同步方法,无缝返回最新数据。 - sync : { - //同步方法的具体说明会在后文提到 - } -}) -global.storage = storage; export default class Info extends Component{ constructor(props) { super(props); this.state = { isCollected: false, - message: '' + saveRet:[], + textPressed: 'black', }; - // console.log(this.props.navComponent); - // this.props.navBarTintColor = 'red'; + + this.reSetNavItems(); + } + reSetNavItems(){ this.props.navComponent.setNavItems({ - // leftItem: { - // component: ( - // - // - // - // ), - // event: function(popHelper) { - // popHelper(); - // AlertIOS.alert('The event comes from Left NavBar Item'); - // }.bind(this) - // }, rightItem: { component: ( - 收藏 + {this.state.isCollected?'取消收藏':'收藏'} ), event: function() { - - AlertIOS.alert('收藏成功'); + this.collectBtnClick(); }.bind(this) }, title:{ @@ -78,6 +67,37 @@ export default class Info extends Component{ ) }, }); + + } + collectBtnClick(){ + if (this.state.isCollected) { + MessageInfoManager.delWithKey(this.props.movie.id, (error,ret)=>{ + if (ret) { + this.setState({isCollected:false}); + AlertIOS.alert('取消收藏成功'); + this.reSetNavItems(); + this.props.navComponent.reloadView(); + }else{ + AlertIOS.alert('取消收藏失败'); + } + }); + + }else{ + + + MessageInfoManager.saveMessageWithKey(this.props.movie.id,this.props.movie.imageurl,this.props.movie.title,(error,ret)=>{ + if(error){ + console.log(error); + }else{ + this.setState({isCollected:true}); + AlertIOS.alert('收藏成功'); + this.reSetNavItems(); + this.props.navComponent.reloadView(); + } + }); + + } + } pushPage() { this.props.navigator.push({ @@ -86,41 +106,58 @@ export default class Info extends Component{ }); } componentDidMount(){ - storage.load({ - key: 'moviec', - }).then( ret => { + MessageInfoManager.isExistWithKey(this.props.movie.id,(error,ret)=>{ + if (ret) { + this.setState({isCollected:true}); + this.reSetNavItems(); + this.props.navComponent.reloadView(); + }; - if (ret) {ret.push(this.props.movie.id)}else{ - ret = []; - ret.push(this.props.movie.id); - } - - console.log(ret); - storage.save({ - key: 'moviec', //注意:请不要在key中使用_下划线符号! - rawData: ret, - expires: null - }); - }).catch( err => { - storage.save({ - key: 'moviec', - rawData: [], - expires: null - }) - }) + }); } render() { + return ( + + + - {this.props.movie.title} + + {this.props.movie.title} + + ); } + onTextPress(e: Event){ + this.setState({textPressed:'#61BFA9'}); + ASHUIMenuControllerManager.showMenuWithTitleArr(['复制文本'], e.nativeEvent.pageX, e.nativeEvent.pageY,(error,ret)=>{ + this.hideMenu(); + // ASHUtilManager.pasteWithText(this.props.movie.title); + Clipboard.setString(this.props.movie.title); + }); + } + hideMenu(e: Event){ + ASHUIMenuControllerManager.hideMenu(); + this.setState({textPressed:'black'}); + } + onImagePress(e: Event){ + ASHUIMenuControllerManager.showMenuWithTitleArr(['保存'], e.nativeEvent.pageX, e.nativeEvent.pageY,(error,ret)=>{ + CameraRoll.saveImageWithTag(this.props.movie.imageurl,(ret)=>{ + console.log(ret+'save image success'); + AlertIOS.alert('保存成功'); + },(error)=>{ + console.log('error on save image'); + AlertIOS.alert('保存失败'); + }) + }); + } } var styles = StyleSheet.create({ @@ -148,7 +185,7 @@ var styles = StyleSheet.create({ }, tabContentStyle: { flex: 1, - backgroundColor: 'ebebeb', + backgroundColor: '#ebebeb', justifyContent: 'center', alignItems: 'center' }, diff --git a/MyListView.js b/MyListView.js new file mode 100644 index 0000000..141b5ca --- /dev/null +++ b/MyListView.js @@ -0,0 +1,214 @@ +//3个主界面的listview + +'use strict'; +import React, { + AppRegistry, + Component, + StyleSheet, + ListView, + Text, + View, + Image, + TouchableOpacity, + AlertIOS, + RefreshControl, + ActivityIndicatorIOS +} from 'react-native'; + + +import InfoPage from './Info.js' + + +export default class MyListView extends Component{ + + //初始化。 + constructor(props) { + super(props); + this.state = { + isLoading: true, //是否正在加载. + isLoadingFail: true, //是否加载失败. + isHaveData: false, //是否有加载出数据了。 + dataSource: new ListView.DataSource({ + rowHasChanged: (row1, row2) => row1 !== row2, + }), + queryNumber: 0, + }; + // this.setState({dataSource:this.props.dataSource}); + + } + + componentDidMount(){ + // this.props.navComponent.setNavItems({ + // title: { + // component: ( + // + // {this.props.title} + // + // ), + // event: function() { + // this.fetchData(); + // }.bind(this) + // } + // }), + this.myfetchData(); + } + + onRefresh(){ + this.myfetchData(); + } +//数据查询. + myfetchData(){ + this.setState({isLoading:true,isLoadingFail:false}); + this.props.fetchData().then((responseData)=>{ + console.log('接受到数据'); + console.log(responseData); + this.setState({ + isLoading: false, + isLoadingFail: false, + isHaveData: true, + + // dataSource:this.state.dataSource.cloneWithRows(responseData), + }); + },(error)=>{ + AlertIOS.alert('没有数据'); + this.setState({ + isLoading: false, + isLoadingFail:true, + isHaveData:false, + }); + }); + } + + render(){ + // return this.renderLoadingView(); + + if (!this.state.isHaveData) { + return this.renderLoadingView(); + } + return ( + } + style={styles.listView}/> + ); + } + pushInfo(index){ + this.props.navigator.push({ + title: 'New Page', + component: + }).bind(this); + } + renderLoadingView(){ + if (this.state.isLoadingFail) { + return ( + this.myfetchData.bind(this)} style={styles.container} > + + + {'点击刷新'} + + + + ); + }else{ + return( + + + {'正在刷新'} + + + + ) + } + } + renderMovieRow(sectionID, rowID, adjacentRowHighlighted){ + return ( + + + + ); + } + + renderMovie(movie,sectionID, rowID, highlightRow){ + return ( + + + this.pushInfo.bind(this)} style={styles.container} > + + + {movie.title} + + + + ); + } +} + +const styles = StyleSheet.create({ + container: { + flex:2, + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + backgroundColor: 'White', + }, + welcome: { + fontSize: 20, + textAlign: 'center', + margin: 10, + }, + instructions: { + textAlign: 'center', + color: '#333333', + marginBottom: 5, + }, + title: { + fontSize: 15, + marginBottom: 8, + marginTop: 10, + marginLeft: 4, + marginRight: 4, + textAlign: 'left', + }, + year: { + textAlign: 'center', + }, + rightContainer: { + flex: 1, + }, + topContainer:{ + flex:1, + height : 30, + backgroundColor: 'LightGray', + }, + thumbnail: { + width: 400, + height: 200, + }, + listView: { + paddingTop: 0, + marginBottom: 44, + backgroundColor: 'LightGray', + }, + navItem: { + flex: 1, + justifyContent: 'center', + alignItems: 'center' + }, + // top{ + // height:60, + // flex: 1, + // }, +}); + +module.exports = MyListView; \ No newline at end of file diff --git a/MyListViewDemo.js b/MyListViewDemo.js new file mode 100644 index 0000000..09003e4 --- /dev/null +++ b/MyListViewDemo.js @@ -0,0 +1,149 @@ +//3个主界面的listview + +'use strict'; +import React, { + AppRegistry, + Component, + StyleSheet, + ListView, + Text, + View, + Image, + TouchableOpacity, + AlertIOS, + RefreshControl, + ActivityIndicatorIOS +} from 'react-native'; + + +import MyListView from './MyListView' +var isPromise = require('is-promise') +var REQUEST_URL = 'http://127.0.0.1:3000/users/list'; + +export default class MyListViewDemo extends Component{ + + //初始化。 + constructor(props) { + super(props); + this.state = { + dataSource: new ListView.DataSource({ + rowHasChanged: (row1, row2) => row1 !== row2, + }), + }; + } + + componentDidMount(){ + this.props.navComponent.setNavItems({ + title: { + component: ( + + 随机 + + ), + event: function() { + this.fetchData(); + }.bind(this) + } + }) + } + + onRefresh(){ + this.myfetchData(); + } +//数据查询. + fetchData(){ + var page = Math.random() * 1000; + page = Math.floor(page); + var url = REQUEST_URL + '?page=' + page; + return new Promise((resolve, reject)=>{ + fetch(url) + .then((response) => response.json()) + .catch((error) => { + reject(err); + }) + .then((responseData) => { + if(responseData){ + this.setState({ + dataSource: this.state.dataSource.cloneWithRows(responseData.datas), + }); + resolve(responseData.datas); + }else{ + reject('none'); + } + + }) + .done(); + }) + + } + + render(){ + return ( + + ); + } + +} + +const styles = StyleSheet.create({ + container: { + flex:2, + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + backgroundColor: 'White', + }, + welcome: { + fontSize: 20, + textAlign: 'center', + margin: 10, + }, + instructions: { + textAlign: 'center', + color: '#333333', + marginBottom: 5, + }, + title: { + fontSize: 15, + marginBottom: 8, + marginTop: 10, + marginLeft: 4, + marginRight: 4, + textAlign: 'left', + }, + year: { + textAlign: 'center', + }, + rightContainer: { + flex: 1, + }, + topContainer:{ + flex:1, + height : 30, + backgroundColor: 'LightGray', + }, + thumbnail: { + width: 400, + height: 200, + }, + listView: { + paddingTop: 0, + marginBottom: 44, + backgroundColor: 'LightGray', + }, + navItem: { + flex: 1, + justifyContent: 'center', + alignItems: 'center' + }, + // top{ + // height:60, + // flex: 1, + // }, +}); + +module.exports = MyListViewDemo; \ No newline at end of file diff --git a/RandPage.js b/RandPage.js index 3ca5510..081822e 100644 --- a/RandPage.js +++ b/RandPage.js @@ -119,7 +119,7 @@ getInitialState: function() { 点击刷新 - + diff --git a/home.js b/home.js index 148422a..4bda3d9 100644 --- a/home.js +++ b/home.js @@ -14,10 +14,10 @@ import React, { TouchableOpacity, AlertIOS, ActivityIndicatorIOS, + RefreshControl, } from 'react-native'; import InfoPage from './Info.js' -var ControlledRefreshableListView = require('./lib/ControlledRefreshableListView'); var REQUEST_URL = 'http://127.0.0.1:3000/users/list'; var MOCKED_MOVIES_DATA = [ {title: 'Title', year: '2015', posters: {thumbnail: 'http://i.imgur.com/UePbdph.jpg'}}, @@ -136,21 +136,23 @@ getInitialState: function() { return this.renderLoadingView(); } - return ( - this.onRefreshData()} - onResponderRelease={()=>this} - refreshDescription="加载中" - waitingDescription="松开可以刷新" + refreshControl={ + } style={styles.listView}/> ); - }, +}, renderFoot:function(){ return ( diff --git a/index.ios.js b/index.ios.js index a4f1376..851168f 100644 --- a/index.ios.js +++ b/index.ios.js @@ -1,6 +1,5 @@ 'use strict'; import React from 'react-native'; -import TabBarNavigator from 'react-native-tabbar-navigator'; const { Component, StyleSheet, @@ -14,6 +13,9 @@ const { } = React; var HomePage = require('./home'); var RandPage = require('./RandPage'); +var CollectPage = require('./Collect'); +var MyListViewDemo = require('./MyListViewDemo'); +var TabBarNavigator = require('./lib/MainNavigator'); const base64Icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABLCAQAAACSR7JhAAADtUlEQVR4Ac3YA2Bj6QLH0XPT1Fzbtm29tW3btm3bfLZtv7e2ObZnms7d8Uw098tuetPzrxv8wiISrtVudrG2JXQZ4VOv+qUfmqCGGl1mqLhoA52oZlb0mrjsnhKpgeUNEs91Z0pd1kvihA3ULGVHiQO2narKSHKkEMulm9VgUyE60s1aWoMQUbpZOWE+kaqs4eLEjdIlZTcFZB0ndc1+lhB1lZrIuk5P2aib1NBpZaL+JaOGIt0ls47SKzLC7CqrlGF6RZ09HGoNy1lYl2aRSWL5GuzqWU1KafRdoRp0iOQEiDzgZPnG6DbldcomadViflnl/cL93tOoVbsOLVM2jylvdWjXolWX1hmfZbGR/wjypDjFLSZIRov09BgYmtUqPQPlQrPapecLgTIy0jMgPKtTeob2zWtrGH3xvjUkPCtNg/tm1rjwrMa+mdUkPd3hWbH0jArPGiU9ufCsNNWFZ40wpwn+62/66R2RUtoso1OB34tnLOcy7YB1fUdc9e0q3yru8PGM773vXsuZ5YIZX+5xmHwHGVvlrGPN6ZSiP1smOsMMde40wKv2VmwPPVXNut4sVpUreZiLBHi0qln/VQeI/LTMYXpsJtFiclUN+5HVZazim+Ky+7sAvxWnvjXrJFneVtLWLyPJu9K3cXLWeOlbMTlrIelbMDlrLenrjEQOtIF+fuI9xRp9ZBFp6+b6WT8RrxEpdK64BuvHgDk+vUy+b5hYk6zfyfs051gRoNO1usU12WWRWL73/MMEy9pMi9qIrR4ZpV16Rrvduxazmy1FSvuFXRkqTnE7m2kdb5U8xGjLw/spRr1uTov4uOgQE+0N/DvFrG/Jt7i/FzwxbA9kDanhf2w+t4V97G8lrT7wc08aA2QNUkuTfW/KimT01wdlfK4yEw030VfT0RtZbzjeMprNq8m8tnSTASrTLti64oBNdpmMQm0eEwvfPwRbUBywG5TzjPCsdwk3IeAXjQblLCoXnDVeoAz6SfJNk5TTzytCNZk/POtTSV40NwOFWzw86wNJRpubpXsn60NJFlHeqlYRbslqZm2jnEZ3qcSKgm0kTli3zZVS7y/iivZTweYXJ26Y+RTbV1zh3hYkgyFGSTKPfRVbRqWWVReaxYeSLarYv1Qqsmh1s95S7G+eEWK0f3jYKTbV6bOwepjfhtafsvUsqrQvrGC8YhmnO9cSCk3yuY984F1vesdHYhWJ5FvASlacshUsajFt2mUM9pqzvKGcyNJW0arTKN1GGGzQlH0tXwLDgQTurS8eIQAAAABJRU5ErkJggg=='; const shareImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAACIlBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8xtw6+AAAAtXRSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGhscHR4fICEiIyQlJicqKywuLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0lKS0xNTk9QUVJUVVdYWVxeX2FiY2RmZ2hpa2xtb3Bxc3R1d3h7f4CCg4WGiImLjI6PkZKUlZeYmpudnqCio6WmqKqrra+wsrS1t7m6vL7AwcPFx8jKzM7P0dPV19na3N7g4uTm6Onr7e/x8/X3+fv909B6DgAADGpJREFUeNrtXftfE8cWn2yAxPIKLxW41JqI6CU8Lg1cUQpYleKt9sa01+oVpbZqtfVVERVQtBaNPGpFEFQ0FBUqUBQM+/9dgt6PSjOzZ3YHMmeX7+9zMt+T3dkzZ875DiHooSS7qxtbg32hifBEqC/Y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'; const arrowImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAABa1BMVEUAAAD8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwP8AwPj53TrAAAAeHRSTlMAAQIDBAUHCAkKCwwOEBEUFRYXGRoeHyAhIiMkJSYnKCkqKywtLi8wMTIzNzg5PD9AQkNFR0lNUFFSVFVbXV5iY2RmZ294eXt8gIKDhYaIiYuMjo+RkpSVl5iam52eoqivtLW3vsPFyMzP09ze4ubp7e/x8/X5+/2lMJsqAAACwklEQVR42u3d2U5TYRiF4dXJYhVUFKkgalWUKs4KzjhbB6SOSKkDdcCxINLyXb4HoqlwYoiJSde77uB5D3Z2/v0nW2KMMcYYY4wxxhhjjDHGGGP/bx3HX9Qjol45us6Rny3F7y3dyNj5C4vRuvkeM/9orNwxK/9QrN5pI//GRngXqERYF9gc4V1gLMwLfAzvAskI7wIdYV6gK8wL5MK8QDrcC8y5F7gd5gUGwr3AO/cC+XAvcNW+wHP3AokqBShAAfsC0xSggH2BCgUoQAH7AlMUoAAF7AtwPkABClBgkgIUsC/wjAL2X0woQIGnFKCAfYEnFKAABewLPKaAfYFHFKAABewLPKQABShgX6BMAQrYF5igAAXsCzygAAXsC4xTgAIUsC9wnwIUoIB9gXsUsC9wlwIUsC9whwJrK5DpP3L2YlvsSmMNBYozYbY/CnS/D7+1FBhuRjgXOBOmO/zT3+fqj+YWSUp/sw0QnxOSrofxTknppnOAOWkwrLfpr94b23ijeuMd4Ja+egeY1oJ3gFea9Q4wrqp3gGsa8Q5QUKd3gJRUc/aXJW11DpCTpJKv/7IkKfHa1T+1fCKUMi1QS/46E0uUvP2SttW8/ZI6R6qzC8b+dlpPA7+zfzt+/Mb+Xvz48eN39TfxO/vz+K39O/Bb+/vw48ePH7+lvx8/fmP/TvzW/oEl/Pjx48fv6N+FH7+xfzd+/Mb+PfjxG/sL+PHjt/XvxY/f2L8Pv7c/8Dv79+O39g/it/YfwI8fP35T/0H8+I39Q/h5/hv7u83vf2bq3n7dNPfnzP06b+7XW3N/0tyvrLlfXeZ+bTD3K2Pul76b+1U296to7lfii7dfGjb3S5PmfiVX//ZtxskvpV6u8E8kZLYLiy38+ZPyW+bSp2X+h3MpeW59/tCJYm9WjDHGGGOMMcYYY4wxxhhjjP2r/QD5wMmbST2PxgAAAABJRU5ErkJggg=='; @@ -106,6 +108,12 @@ class TabBarNavigatorExample extends Component { + + + + + + ); } diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..3b598ce --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,3 @@ +platform :ios, ‘7.0’ +pod 'LKDBHelper' + diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..e829489 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,15 @@ +PODS: + - FMDB (2.6): + - FMDB/standard (= 2.6) + - FMDB/standard (2.6) + - LKDBHelper (2.1.8): + - FMDB + +DEPENDENCIES: + - LKDBHelper + +SPEC CHECKSUMS: + FMDB: c1968bab3ab0aed38f66cb778ae1e7fa9a652b6e + LKDBHelper: 1b55f67e44f34af8828b31aa36b36141fdde03a8 + +COCOAPODS: 0.39.0 diff --git a/ios/testdemo.xcodeproj/project.pbxproj b/ios/testdemo.xcodeproj/project.pbxproj index 0af9d9d..0168d62 100644 --- a/ios/testdemo.xcodeproj/project.pbxproj +++ b/ios/testdemo.xcodeproj/project.pbxproj @@ -22,6 +22,13 @@ 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; + 9F11DD32883B03E4B264948B /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D67D0A238A6039E65D1E8453 /* libPods.a */; }; + A96B82451C7C3CE600FFB1FE /* ASHUIMenuControllerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A96B823C1C7C3CE600FFB1FE /* ASHUIMenuControllerManager.m */; }; + A96B82461C7C3CE600FFB1FE /* ASHUtilManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A96B823E1C7C3CE600FFB1FE /* ASHUtilManager.m */; }; + A96B82471C7C3CE600FFB1FE /* MessageInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = A96B82401C7C3CE600FFB1FE /* MessageInfo.m */; }; + A96B82481C7C3CE600FFB1FE /* MessageInfoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A96B82421C7C3CE600FFB1FE /* MessageInfoManager.m */; }; + A96B82491C7C3CE600FFB1FE /* UIViewController+Category.m in Sources */ = {isa = PBXBuildFile; fileRef = A96B82441C7C3CE600FFB1FE /* UIViewController+Category.m */; }; + A96B825A1C7C407500FFB1FE /* libRCTCameraRoll.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A96B82591C7C3FCB00FFB1FE /* libRCTCameraRoll.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -102,6 +109,13 @@ remoteGlobalIDString = 58B5119B1A9E6C1200147676; remoteInfo = RCTText; }; + A96B82581C7C3FCB00FFB1FE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A96B82541C7C3FCB00FFB1FE /* RCTCameraRoll.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5115D1A9E6B3D00147676; + remoteInfo = RCTCameraRoll; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -124,8 +138,22 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = testdemo/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = testdemo/main.m; sourceTree = ""; }; 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; + 4E8B8F317A98774CD5A46837 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + 589BBF17415E6F48D1D7AD15 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; + A96B823B1C7C3CE600FFB1FE /* ASHUIMenuControllerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASHUIMenuControllerManager.h; sourceTree = ""; }; + A96B823C1C7C3CE600FFB1FE /* ASHUIMenuControllerManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASHUIMenuControllerManager.m; sourceTree = ""; }; + A96B823D1C7C3CE600FFB1FE /* ASHUtilManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASHUtilManager.h; sourceTree = ""; }; + A96B823E1C7C3CE600FFB1FE /* ASHUtilManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASHUtilManager.m; sourceTree = ""; }; + A96B823F1C7C3CE600FFB1FE /* MessageInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageInfo.h; sourceTree = ""; }; + A96B82401C7C3CE600FFB1FE /* MessageInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MessageInfo.m; sourceTree = ""; }; + A96B82411C7C3CE600FFB1FE /* MessageInfoManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageInfoManager.h; sourceTree = ""; }; + A96B82421C7C3CE600FFB1FE /* MessageInfoManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MessageInfoManager.m; sourceTree = ""; }; + A96B82431C7C3CE600FFB1FE /* UIViewController+Category.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+Category.h"; sourceTree = ""; }; + A96B82441C7C3CE600FFB1FE /* UIViewController+Category.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+Category.m"; sourceTree = ""; }; + A96B82541C7C3FCB00FFB1FE /* RCTCameraRoll.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTCameraRoll.xcodeproj; path = "../node_modules/react-native/Libraries/CameraRoll/RCTCameraRoll.xcodeproj"; sourceTree = ""; }; + D67D0A238A6039E65D1E8453 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -140,6 +168,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + A96B825A1C7C407500FFB1FE /* libRCTCameraRoll.a in Frameworks */, 146834051AC3E58100842450 /* libReact.a in Frameworks */, 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, @@ -150,6 +179,7 @@ 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + 9F11DD32883B03E4B264948B /* libPods.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -232,6 +262,7 @@ 13B07FAE1A68108700A75B9A /* testdemo */ = { isa = PBXGroup; children = ( + A96B823A1C7C3CE600FFB1FE /* Class */, 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 13B07FB01A68108700A75B9A /* AppDelegate.m */, @@ -262,6 +293,7 @@ 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( + A96B82541C7C3FCB00FFB1FE /* RCTCameraRoll.xcodeproj */, 146833FF1AC3E56700842450 /* React.xcodeproj */, 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, @@ -291,6 +323,8 @@ 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* testdemoTests */, 83CBBA001A601CBA00E9B192 /* Products */, + D9444A8B1A40711F773FD395 /* Pods */, + C6406205DAB825BD0DC603B2 /* Frameworks */, ); indentWidth = 2; sourceTree = ""; @@ -305,6 +339,49 @@ name = Products; sourceTree = ""; }; + A96B823A1C7C3CE600FFB1FE /* Class */ = { + isa = PBXGroup; + children = ( + A96B823B1C7C3CE600FFB1FE /* ASHUIMenuControllerManager.h */, + A96B823C1C7C3CE600FFB1FE /* ASHUIMenuControllerManager.m */, + A96B823D1C7C3CE600FFB1FE /* ASHUtilManager.h */, + A96B823E1C7C3CE600FFB1FE /* ASHUtilManager.m */, + A96B823F1C7C3CE600FFB1FE /* MessageInfo.h */, + A96B82401C7C3CE600FFB1FE /* MessageInfo.m */, + A96B82411C7C3CE600FFB1FE /* MessageInfoManager.h */, + A96B82421C7C3CE600FFB1FE /* MessageInfoManager.m */, + A96B82431C7C3CE600FFB1FE /* UIViewController+Category.h */, + A96B82441C7C3CE600FFB1FE /* UIViewController+Category.m */, + ); + name = Class; + path = testdemo/Class; + sourceTree = ""; + }; + A96B82551C7C3FCB00FFB1FE /* Products */ = { + isa = PBXGroup; + children = ( + A96B82591C7C3FCB00FFB1FE /* libRCTCameraRoll.a */, + ); + name = Products; + sourceTree = ""; + }; + C6406205DAB825BD0DC603B2 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D67D0A238A6039E65D1E8453 /* libPods.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + D9444A8B1A40711F773FD395 /* Pods */ = { + isa = PBXGroup; + children = ( + 589BBF17415E6F48D1D7AD15 /* Pods.debug.xcconfig */, + 4E8B8F317A98774CD5A46837 /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -330,10 +407,13 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "testdemo" */; buildPhases = ( + F35D02B5C27F53894766E3BE /* Check Pods Manifest.lock */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 1B17331BD8AA282C42483D64 /* Embed Pods Frameworks */, + 3E0A10D478F798AF58FA27F0 /* Copy Pods Resources */, ); buildRules = ( ); @@ -375,6 +455,10 @@ ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; }, + { + ProductGroup = A96B82551C7C3FCB00FFB1FE /* Products */; + ProjectRef = A96B82541C7C3FCB00FFB1FE /* RCTCameraRoll.xcodeproj */; + }, { ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; @@ -491,6 +575,13 @@ remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + A96B82591C7C3FCB00FFB1FE /* libRCTCameraRoll.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTCameraRoll.a; + remoteRef = A96B82581C7C3FCB00FFB1FE /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ @@ -527,6 +618,51 @@ shellPath = /bin/sh; shellScript = "../node_modules/react-native/packager/react-native-xcode.sh"; }; + 1B17331BD8AA282C42483D64 /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3E0A10D478F798AF58FA27F0 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + F35D02B5C27F53894766E3BE /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -542,8 +678,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A96B82491C7C3CE600FFB1FE /* UIViewController+Category.m in Sources */, + A96B82461C7C3CE600FFB1FE /* ASHUtilManager.m in Sources */, + A96B82481C7C3CE600FFB1FE /* MessageInfoManager.m in Sources */, + A96B82451C7C3CE600FFB1FE /* ASHUIMenuControllerManager.m in Sources */, 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, + A96B82471C7C3CE600FFB1FE /* MessageInfo.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -609,6 +750,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 589BBF17415E6F48D1D7AD15 /* Pods.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEAD_CODE_STRIPPING = NO; @@ -620,13 +762,19 @@ INFOPLIST_FILE = testdemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = "-ObjC"; + OTHER_LDFLAGS = ( + "-ObjC", + "-l\"FMDB\"", + "-l\"LKDBHelper\"", + "-l\"sqlite3\"", + ); PRODUCT_NAME = testdemo; }; name = Debug; }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 4E8B8F317A98774CD5A46837 /* Pods.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; HEADER_SEARCH_PATHS = ( @@ -637,7 +785,12 @@ INFOPLIST_FILE = testdemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = "-ObjC"; + OTHER_LDFLAGS = ( + "-ObjC", + "-l\"FMDB\"", + "-l\"LKDBHelper\"", + "-l\"sqlite3\"", + ); PRODUCT_NAME = testdemo; }; name = Release; diff --git a/ios/testdemo.xcworkspace/contents.xcworkspacedata b/ios/testdemo.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..11f787f --- /dev/null +++ b/ios/testdemo.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/testdemo/Class/ASHUIMenuControllerManager.h b/ios/testdemo/Class/ASHUIMenuControllerManager.h new file mode 100644 index 0000000..603cd33 --- /dev/null +++ b/ios/testdemo/Class/ASHUIMenuControllerManager.h @@ -0,0 +1,14 @@ +// +// ASHUIMenuControllerManager.h +// testdemo +// +// Created by xmfish on 16/2/19. +// Copyright © 2016年 Facebook. All rights reserved. +// + +#import +#import "RCTBridgeModule.h" +#import "RCTLog.h" +@interface ASHUIMenuControllerManager : NSObject + +@end diff --git a/ios/testdemo/Class/ASHUIMenuControllerManager.m b/ios/testdemo/Class/ASHUIMenuControllerManager.m new file mode 100644 index 0000000..ac0ead8 --- /dev/null +++ b/ios/testdemo/Class/ASHUIMenuControllerManager.m @@ -0,0 +1,78 @@ +// +// ASHUIMenuControllerManager.m +// testdemo +// +// Created by xmfish on 16/2/19. +// Copyright © 2016年 Facebook. All rights reserved. +// + +#import "ASHUIMenuControllerManager.h" +#import +#import "RCTConvert.h" +#import "RCTLog.h" +#import "RCTUtils.h" +#import "RCTBridge.h" +#import "RCTUIManager.h" +#import "UIViewController+Category.h" +@implementation ASHUIMenuControllerManager +{ + NSMapTable *_callbacks; + UIMenuController *_menu; +} +RCT_EXPORT_MODULE(); +- (dispatch_queue_t)methodQueue +{ + return dispatch_get_main_queue(); +} +RCT_EXPORT_METHOD(hideMenu) +{ + if (_menu) { + [_menu setMenuVisible:NO]; + } +} +RCT_EXPORT_METHOD(showMenuWithTitleArr:(NSArray*)titleArray withXPoint:(nonnull NSNumber*)xpoint withYPoint:(nonnull NSNumber*)ypoint withCallback:(RCTResponseSenderBlock)callback) +{ + if (!_callbacks) { + _callbacks = [NSMapTable strongToStrongObjectsMapTable]; + } + + if(titleArray.count>0){ + NSMutableArray* itemArr = [NSMutableArray array]; + [titleArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:obj action:@selector(meunClick:)]; + [itemArr addObject:menuItem]; + }]; + + UIViewController *controller = RCTKeyWindow().rootViewController; + + while (controller.presentedViewController) { + controller = controller.presentedViewController; + } + + if (controller == nil) { + RCTLogError(@"Tried to display MenuController but there is no application window. options: %@", titleArray); + return; + } + controller.rnDelegate = self; + UIView *sourceView = controller.view; + [sourceView becomeFirstResponder]; + + + UIMenuController *menu = [UIMenuController sharedMenuController]; + [menu setMenuItems:itemArr]; + [menu setTargetRect:CGRectMake(xpoint.floatValue, ypoint.floatValue, 1.0, 1.0) inView:sourceView]; + [menu setMenuVisible:YES animated:YES]; + _menu = menu; + [_callbacks setObject:callback forKey:menu]; + }else{ + callback(@[@"no title"]); + } +} + +-(void)meunClick:(UIMenuController*)menuController +{ + if ([_callbacks objectForKey:menuController]) { + ((RCTResponseSenderBlock)[_callbacks objectForKey:menuController])(@[@"no title", @1]); + } +} +@end diff --git a/ios/testdemo/Class/ASHUtilManager.h b/ios/testdemo/Class/ASHUtilManager.h new file mode 100644 index 0000000..52dc1ab --- /dev/null +++ b/ios/testdemo/Class/ASHUtilManager.h @@ -0,0 +1,14 @@ +// +// ASHUtilManager.h +// testdemo +// +// Created by xmfish on 16/2/22. +// Copyright © 2016年 Facebook. All rights reserved. +// + +#import +#import "RCTBridgeModule.h" +#import "RCTLog.h" +@interface ASHUtilManager : NSObject + +@end diff --git a/ios/testdemo/Class/ASHUtilManager.m b/ios/testdemo/Class/ASHUtilManager.m new file mode 100644 index 0000000..44d6bb4 --- /dev/null +++ b/ios/testdemo/Class/ASHUtilManager.m @@ -0,0 +1,21 @@ +// +// ASHUtilManager.m +// testdemo +// +// Created by xmfish on 16/2/22. +// Copyright © 2016年 Facebook. All rights reserved. +// + +#import "ASHUtilManager.h" +#import +@implementation ASHUtilManager + +RCT_EXPORT_MODULE(); + +//复制文本 +RCT_EXPORT_METHOD(pasteWithText:(NSString*)text) +{ + UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; + pasteboard.string = text; +} +@end diff --git a/ios/testdemo/Class/MessageInfo.h b/ios/testdemo/Class/MessageInfo.h new file mode 100644 index 0000000..64c0c6a --- /dev/null +++ b/ios/testdemo/Class/MessageInfo.h @@ -0,0 +1,21 @@ +// +// MessageInfo.h +// testdemo +// +// Created by xmfish on 16/2/18. +// Copyright © 2016年 Facebook. All rights reserved. +// + +#import + +#import +#import "NSObject+LKDBHelper.h" +@interface MessageInfo : NSObject + +@property(nonatomic, strong) NSString* title; +@property(nonatomic, strong) NSString* image; +@property(nonatomic, strong) NSString* infoKey; + +-(NSDictionary*)dictionary; +-(NSString*)JSON; +@end diff --git a/ios/testdemo/Class/MessageInfo.m b/ios/testdemo/Class/MessageInfo.m new file mode 100644 index 0000000..2934a2e --- /dev/null +++ b/ios/testdemo/Class/MessageInfo.m @@ -0,0 +1,28 @@ +// +// MessageInfo.m +// testdemo +// +// Created by xmfish on 16/2/18. +// Copyright © 2016年 Facebook. All rights reserved. +// + +#import "MessageInfo.h" + +@implementation MessageInfo ++(NSString *)getTableName +{ + return @"MessageInfo"; +} ++ (NSString*)getPrimaryKey +{ + return @"infoKey"; +} +-(NSDictionary*)dictionary +{ + return [NSDictionary dictionaryWithObjectsAndKeys:self.infoKey, @"id", self.title,@"title", self.image,@"imageurl", nil]; +} +-(NSString*)JSON +{ + return [NSString stringWithFormat:@"{'id':%@,'title':%@,'imageurl':%@}",self.infoKey,self.title,self.image]; +} +@end diff --git a/ios/testdemo/Class/MessageInfoManager.h b/ios/testdemo/Class/MessageInfoManager.h new file mode 100644 index 0000000..83d6ddf --- /dev/null +++ b/ios/testdemo/Class/MessageInfoManager.h @@ -0,0 +1,14 @@ +// +// MessageInfoManager.h +// testdemo +// +// Created by xmfish on 16/2/18. +// Copyright © 2016年 Facebook. All rights reserved. +// + +#import +#import "RCTBridgeModule.h" +#import "RCTLog.h" +@interface MessageInfoManager : NSObject + +@end diff --git a/ios/testdemo/Class/MessageInfoManager.m b/ios/testdemo/Class/MessageInfoManager.m new file mode 100644 index 0000000..388ccfd --- /dev/null +++ b/ios/testdemo/Class/MessageInfoManager.m @@ -0,0 +1,65 @@ +// +// MessageInfoManager.m +// testdemo +// +// Created by xmfish on 16/2/18. +// Copyright © 2016年 Facebook. All rights reserved. +// + +#import "MessageInfoManager.h" +#import "MessageInfo.h" +#import +#import "NSObject+LKDBHelper.h" +#import "UIView+React.h" +@implementation MessageInfoManager + + + +RCT_EXPORT_MODULE(); + +RCT_EXPORT_METHOD(getMessageArrWithCallBack:(RCTResponseSenderBlock)callback) +{ + RCTLogInfo(@"getMessageArrWithCallBack"); + NSMutableArray* array = [MessageInfo searchWithWhere:nil orderBy:nil offset:0 count:MAXFLOAT]; + if (array) { + NSMutableArray* resultArr = [NSMutableArray array]; + [array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + + [resultArr addObject:[obj dictionary]]; + }]; + callback(@[[NSNull null], resultArr]); + + }else{ + callback(@[@"no data", [NSNull null]]); + } + +} +RCT_EXPORT_METHOD(saveMessageWithKey:(NSString*)key withImage:(NSString*)image withTitle:(NSString*)title withCallBack:(RCTResponseSenderBlock)callback) +{ + RCTLogInfo(@"saveMessageWithKey"); + MessageInfo* info = [[MessageInfo alloc] init]; + info.infoKey = key; + info.image = image; + info.title = title; + + + BOOL ret = [MessageInfo insertWhenNotExists:info]; + if (ret) { + callback(@[[NSNull null], @1]); + }else{ + callback(@[@"unkonwerror", [NSNull null]]); + } +} + +RCT_EXPORT_METHOD(isExistWithKey:(NSString*)key withCallBack:(RCTResponseSenderBlock)callback) +{ + NSMutableArray* array = [MessageInfo searchWithWhere:@{@"infokey":key}]; + + callback(@[[NSNull null], @(array.count>0?1:0)]); +} +RCT_EXPORT_METHOD(delWithKey:(NSString*)key withCallBack:(RCTResponseSenderBlock)callback) +{ + BOOL ret = [MessageInfo deleteWithWhere:@{@"infokey":key}]; + callback(@[[NSNull null], @(ret)]); +} +@end diff --git a/ios/testdemo/Class/UIViewController+Category.h b/ios/testdemo/Class/UIViewController+Category.h new file mode 100644 index 0000000..a61a7ef --- /dev/null +++ b/ios/testdemo/Class/UIViewController+Category.h @@ -0,0 +1,14 @@ +// +// UIViewController+Category.h +// testdemo +// +// Created by xmfish on 16/2/19. +// Copyright © 2016年 Facebook. All rights reserved. +// + +#import + +@interface UIViewController (Category) + +@property (nonatomic, weak)id rnDelegate; +@end diff --git a/ios/testdemo/Class/UIViewController+Category.m b/ios/testdemo/Class/UIViewController+Category.m new file mode 100644 index 0000000..0b7c17c --- /dev/null +++ b/ios/testdemo/Class/UIViewController+Category.m @@ -0,0 +1,38 @@ +// +// UIViewController+Category.m +// testdemo +// +// Created by xmfish on 16/2/19. +// Copyright © 2016年 Facebook. All rights reserved. +// + +#import "UIViewController+Category.h" +#import "objc/runtime.h" +static char rnDelegateURLKey; +@implementation UIViewController (Category) + +- (void)setRnDelegate:(id)rnDelegate +{ + objc_setAssociatedObject(self,&rnDelegateURLKey, rnDelegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} +- (id)rnDelegate +{ + return objc_getAssociatedObject(self, &rnDelegateURLKey); +} +-(BOOL)canBecomeFirstResponder +{ + return YES; +} +- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { + if (action == @selector(meunClick:) ){ + return YES; + } + return NO; +} +-(void)meunClick:(id)sender +{ + if (self.rnDelegate && [self.rnDelegate respondsToSelector:@selector(meunClick:)]) { + [self.rnDelegate meunClick:sender]; + } +} +@end diff --git a/lib/ControlledRefreshableListView.js b/lib/ControlledRefreshableListView.js deleted file mode 100644 index 2c8ccdc..0000000 --- a/lib/ControlledRefreshableListView.js +++ /dev/null @@ -1,186 +0,0 @@ -var React = require('react-native') -var { - PropTypes, - StyleSheet, - ActivityIndicatorIOS, - View, - Text, -} = React -var ListView = require('./ListView') -var createElementFrom = require('./createElementFrom') -var RefreshingIndicator = require('./RefreshingIndicator') -var isPromise = require('is-promise') -var delay = require('./delay') - -const SCROLL_EVENT_THROTTLE = 32 -const MIN_PULLDOWN_DISTANCE = 40 - -const LISTVIEW_REF = 'listview' - -var ControlledRefreshableListView = React.createClass({ - propTypes: { - onRefresh: PropTypes.func.isRequired, - minDisplayTime: PropTypes.number, - minBetweenTime: PropTypes.number, - isRefreshing: PropTypes.bool.isRequired, - refreshDescription: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), - waitingDescription: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), - refreshingIndictatorComponent: PropTypes.oneOfType([PropTypes.func, PropTypes.element]), - minPulldownDistance: PropTypes.number, - ignoreInertialScroll: PropTypes.bool, - scrollEventThrottle: PropTypes.number, - onScroll: PropTypes.func, - renderHeader: PropTypes.func, - renderHeaderWrapper: PropTypes.func, - onResponderGrant: PropTypes.func, - onResponderRelease: PropTypes.func, - }, - getInitialState() { - return { - refreshstate: 1,//1普通,2下拉中,3下拉可以松手,4刷新中 - } - }, - getDefaultProps() { - return { - minDisplayTime: 300, - minBetweenTime: 300, - minPulldownDistance: MIN_PULLDOWN_DISTANCE, - scrollEventThrottle: SCROLL_EVENT_THROTTLE, - ignoreInertialScroll: true, - refreshingIndictatorComponent: RefreshingIndicator, - } - }, - handleScroll(e) { - var scrollY = e.nativeEvent.contentInset.top + e.nativeEvent.contentOffset.y - - if (this.beginTouch && (this.state.refreshstate==2 || this.state.refreshstate==1) && scrollY< -this.props.minPulldownDistance) { - this.setState({ - refreshstate: 3, - }) - }else if(this.beginTouch && this.state.refreshstate==1 && (scrollY < -20)){ - this.setState({ - refreshstate: 2, - }) - } - - - if (this.endTouch || (!this.endTouch && !this.props.ignoreInertialScroll)) { - if (scrollY < -this.props.minPulldownDistance) { - if (!this.props.isRefreshing) { - - this.setState({ - refreshstate: 4, - }) - if (this.props.onRefresh ) { - this.props.onRefresh() - } - } - } - } - - this.props.onScroll && this.props.onScroll(e) - }, - handleResponderGrant() { - - this.endTouch = false - this.beginTouch = true - this.isTouching = true - if (this.props.onResponderGrant) { - this.props.onResponderGrant.apply(null, arguments) - } - }, - handleResponderRelease() { - this.endTouch = true - this.beginTouch = false - this.isTouching = false - if(this.state.refreshstate == 2){ - this.setState({refreshstate:1}) - } - if(this.state.refreshstate == 3){ - this.setState({refreshstate:4}) - } - if (this.props.onResponderRelease) { - this.props.onResponderRelease.apply(null, arguments) - } - }, - getScrollResponder() { - return this.refs[LISTVIEW_REF].getScrollResponder() - }, - setNativeProps(props) { - this.refs[LISTVIEW_REF].setNativeProps(props) - }, - renderHeader() { - var description = this.props.refreshDescription - var waiting = '松手即可刷新' - var isscroll = '下拉可以刷新' - var refreshingIndictator - if (this.state.refreshstate == 4) { - // console.log('正在刷新') - Promise.all([ - delay(this.props.minDisplayTime), - ]) - .then(() => { - if (!this.props.isRefreshing) {this.setState({refreshstate:1})}; - }) - // }) - refreshingIndictator = createElementFrom(this.props.refreshingIndictatorComponent, {description:description}) - } else { - if (this.state.refreshstate == 2) { - console.log(waiting) - refreshingIndictator = createElementFrom(this.props.refreshingIndictatorComponent, {description:isscroll,stylesheet:{activityIndicator:styles.refreshhide}}) - // return this.renderFoot - }else if(this.state.refreshstate == 3){ - refreshingIndictator = createElementFrom(this.props.refreshingIndictatorComponent, {description:waiting,stylesheet:{activityIndicator:styles.refreshhide}}) - - }else{ - refreshingIndictator = null - } - - } - if (this.props.renderHeaderWrapper) { - return this.props.renderHeaderWrapper(refreshingIndictator) - } else if (this.props.renderHeader) { - console.warn('renderHeader is deprecated. Use renderHeaderWrapper instead.') - return this.props.renderHeader(refreshingIndictator) - } else { - return refreshingIndictator - } - }, - renderFoot(){ - return ( - - - 下拉刷新 - - ) - }, - render() { - return ( - - ) - }, -}) -const styles = StyleSheet.create({ - tophead:{ - height : 30, - textAlign:'center', - }, - refreshhide:{ - opacity:0, - }, - refreshshow:{ - opacity:100 - } -}); -ControlledRefreshableListView.DataSource = ListView.DataSource -ControlledRefreshableListView.RefreshingIndicator = RefreshingIndicator - -module.exports = ControlledRefreshableListView diff --git a/lib/ListView.js b/lib/ListView.js deleted file mode 100644 index b34ba02..0000000 --- a/lib/ListView.js +++ /dev/null @@ -1,3 +0,0 @@ -var {ListView} = require('react-native') - -module.exports = ListView diff --git a/lib/MainNavigator.js b/lib/MainNavigator.js new file mode 100644 index 0000000..94e594c --- /dev/null +++ b/lib/MainNavigator.js @@ -0,0 +1,202 @@ +'use strict'; + +var React = require('react-native'); +var { + Component, + StyleSheet, + Text, + View, + Navigator, + TouchableOpacity, + SegmentedControlIOS, + Image +} = React; + +var MainTabBar = require('./MainTabBar'); + +var style = StyleSheet.create({ + flexEnabled: { + flex: 1 + }, + leftBackButton: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + paddingLeft: 7 + }, + sceneStyle: { + shadowColor: '#000000', + shadowOpacity: .5, + shadowOffset: { + height: 1, + width: 0 + }, + overflow: 'visible', + flex: 1, + marginTop: 64, + backgroundColor: '#ffffff' + } +}); + +var lightBackArrow = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAA2FBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8lb+eLAAAAR3RSTlMAAQIDBAYICQsMDQ4QERQXGBofJykqODlAQUlMUldeYWhrbW98f4KMlJWYnZ6goqutr7K0tbrAwcPMzs/T5ujp6+/z9ff7/dlYrXMAAAJCSURBVHja7dBXUlQBFEXR+wwtmHNWzBgxZzHDnf+M/LHUgg52lT++s/YM1q7639p/6enmxxeXJxXaxW/d3d1bVzL9d/pX94ZA/3r/0caQ7Q88sMMfd2CXP+zAFH/Ugan+oAMz/DEHZvpDDszxRxyY6w84sMA/+gML/SM/8Bf+7gfh/u4b4f7uo+H+Xg/39/ch2989Cff3ari/94X734T7+0K4//2Q7f+ymu3/eizcf5yfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn39a18P9J8P99SrcvxLur9Ph/jq31IDzo/PXmaUGfD4yugEHO/3A2/QDpzr9wK30A8NDBxxwwAEHHHDAAQcccMABBxxwwAEHHHBg2QOHHXDAAQcccMABBxxwYGwHHjnggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggAMOOOCAAw444IADDjjggANLHvjkgAMOOOCAAw444IADDjjggAMOOOCAAw6M7sCGAw444IADDix5YHOSfuB1pR84m37gZaUf2Jt+YKXCDxyo7ANbQ2UfuFuVfeBEZR+4XRV94MlQ0Qee7alKPjBu/+IDY/cvOjB+//wDCf55BzL8sw88D/HPOpDjn34gyT/tQJZ/94E0/84Def6q4f5v/+NAf1Vd3f7pvzlUZitr77a3P1w7VPon/QDqIm8Mnw8FiAAAAABJRU5ErkJggg=='; + +class TabBarNavigator extends Component { + constructor(props) { + super(props); + + this.state = { + rootNavigatorTitle: '', + currentTabIndex: 0, + refresh:0, + }; + this.navItems = {}; + this.navRouter = {}; + this.currentRoute = null; + this.rootNavigatorItems = {}; + this.currentTabIndex = 0; + + var self = this; + this.navRouter = { + LeftButton(route, navigator, index, navState) { + if (!route.isRoot) { + if (route.navItems && route.navItems.leftItem) { + return React.cloneElement(route.navItems.leftItem.component, { + onPress: () => {route.navItems.leftItem.event(self.popThisNavigator.bind(self, navigator))} + }); + } + else { + return ( + { + self.popThisNavigator(navigator); + }}> + + + ); + } + } + else { + var navItems = self.rootNavigatorItems; + var currentIndex = self.currentTabIndex; + if (navItems[currentIndex] && navItems[currentIndex].leftItem) { + return React.cloneElement(navItems[currentIndex].leftItem.component, { + onPress: () => {navItems[currentIndex].leftItem.event()} + }); + } + } + }, + RightButton(route, navigator, index, navState) { + if (!route.isRoot) { + if (route.navItems && route.navItems.rightItem) { + return React.cloneElement(route.navItems.rightItem.component, { + onPress: () => {route.navItems.rightItem.event(self.popThisNavigator.bind(self, navigator))} + }); + } + } + else { + var navItems = self.rootNavigatorItems; + var currentIndex = self.currentTabIndex; + if (navItems[currentIndex] && navItems[currentIndex].rightItem) { + return React.cloneElement(navItems[currentIndex].rightItem.component, { + onPress: () => {navItems[currentIndex].rightItem.event()} + }); + } + } + }, + Title(route, navigator, index, navState) { + if (!route.isRoot) { + if (route.navItems && route.navItems.title) { + return React.cloneElement(route.navItems.title.component, { + onPress: () => {route.navItems.title.event()} + }); + } + } + else { + var navItems = self.rootNavigatorItems; + var currentIndex = self.state.currentTabIndex; + if (navItems[currentIndex] && navItems[currentIndex].title) { + return React.cloneElement(navItems[currentIndex].title.component, { + onPress: () => {navItems[currentIndex].title.event()} + }); + } + } + return ( + + {route.isRoot ? self.state.rootNavigatorTitle : route.title} + + ); + } + }; + } + setNavItems(config) { + console.log('setting nav items. currentTabIndex: ' + this.currentTabIndex); + if (this.currentRoute.isRoot) { + this.rootNavigatorItems[this.state.currentTabIndex] = config; + this.forceUpdate(); + } + else { + this.currentRoute.navItems = config; + } + } + popThisNavigator(navigator) { + this.resetNavItems(); + this.forceReRender(); + navigator.pop(); + } + resetNavItems() { + this.navItems.rightItem = false; + this.navItems.titleItem = false; + this.navItems.leftItem = false; + } + forceReRender() { + this.setState({ + forceReRender: !this.state.forceReRender + }); + } + reloadView(){ + this.forceUpdate(); + } + renderScene(route, navigator) { + this.currentRoute = route; + this.resetNavItems(); + var newComponent = React.cloneElement(route.component, { + navigator: navigator, + navComponent: this + }); + return newComponent; + } + render() { + var initialRoute = { + title: '', + isRoot: true, + component: ( + + ) + }; + var navBar = ( + + ); + return ( + + ); + } +} + +class TabBarNavigatorItem extends Component { + render() { + return ; + } +} + +TabBarNavigator.Item = TabBarNavigatorItem; + +module.exports = TabBarNavigator; diff --git a/lib/MainTabBar.js b/lib/MainTabBar.js new file mode 100644 index 0000000..db644bb --- /dev/null +++ b/lib/MainTabBar.js @@ -0,0 +1,98 @@ +'use strict'; + +var React = require('react-native'); +var { + Component, + StyleSheet, + Text, + View, + TabBarIOS +} = React; + + +var style = StyleSheet.create({ + rootView: { + flex: 1 + } +}); + +class MainTabBar extends Component { + constructor(props) { + super(props); + this.tabBarData = []; + this.state = { + selectedTab: 0 + }; + } + componentWillMount() { + this.configureTabBar(); + } + configureTabBar() { + var defaultTabIndex = 1; + React.Children.map(this.props.initialConfig, function(eachChild, index) { + var eachTabBarData = { + id: index, + title: eachChild.props.title, + icon: eachChild.props.icon, + component: eachChild.props.children + }; + this.tabBarData.push(eachTabBarData); + + if (eachChild.props.defaultTab) { + defaultTabIndex = index; + } + }.bind(this)); + this.setState({ + selectedTab: defaultTabIndex + }); + this.props.navComponent.currentTabIndex = defaultTabIndex; + this.props.navComponent.setState({ + rootNavigatorTitle: this.tabBarData[defaultTabIndex].title + }); + } + switchTab(tabId, tabTitle, currentTabIndex) { + this.props.navComponent.currentTabIndex = currentTabIndex; + this.props.navComponent.setState({ + currentTabIndex: currentTabIndex, + rootNavigatorTitle: tabTitle + }); + this.props.navComponent.forceUpdate(); + this.setState({ + selectedTab: tabId + }); + } + renderTabBarItems() { + var items = []; + var self = this; + for (var i = 0; i < this.tabBarData.length; i++) { + var eachData = this.tabBarData[i]; + var eachComponent = React.cloneElement(eachData.component, { + navigator: this.props.navigator, + navComponent: this.props.navComponent + }); + items.push( + + {eachComponent} + + ); + } + return items; + } + render() { + return ( + + {this.renderTabBarItems()} + + ); + } +} + +module.exports = MainTabBar; \ No newline at end of file diff --git a/lib/RefreshableListView.js b/lib/RefreshableListView.js deleted file mode 100644 index 246b8f4..0000000 --- a/lib/RefreshableListView.js +++ /dev/null @@ -1,82 +0,0 @@ -var React = require('react-native') -var { - PropTypes, -} = React -var isPromise = require('is-promise') -var delay = require('./delay') -var ListView = require('./ListView') -var RefreshingIndicator = require('./RefreshingIndicator') -var ControlledRefreshableListView = require('./ControlledRefreshableListView') - -const LISTVIEW_REF = 'listview' - -var RefreshableListView = React.createClass({ - propTypes: { - loadData: PropTypes.func.isRequired, - minDisplayTime: PropTypes.number, - minBetweenTime: PropTypes.number, - // props passed to child - refreshDescription: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), - refreshingIndictatorComponent: PropTypes.oneOfType([PropTypes.func, PropTypes.element]), - minPulldownDistance: PropTypes.number, - renderHeaderWrapper: PropTypes.func, - }, - getDefaultProps() { - return { - minDisplayTime: 300, - minBetweenTime: 300, - minPulldownDistance: 40, - refreshingIndictatorComponent: RefreshingIndicator, - } - }, - getInitialState() { - return { - isRefreshing: false, - } - }, - handleRefresh() { - if (this.willRefresh) return - - this.willRefresh = true - - var loadingDataPromise = new Promise((resolve) => { - var loadDataReturnValue = this.props.loadData(resolve) - - if (isPromise(loadDataReturnValue)) { - loadingDataPromise = loadDataReturnValue - } - - Promise.all([ - loadingDataPromise, - new Promise((resolve) => this.setState({isRefreshing: true}, resolve)), - delay(this.props.minDisplayTime), - ]) - .then(() => delay(this.props.minBetweenTime)) - .then(() => { - this.willRefresh = false - this.setState({isRefreshing: false}) - }) - }) - }, - getScrollResponder() { - return this.refs[LISTVIEW_REF].getScrollResponder() - }, - setNativeProps(props) { - this.refs[LISTVIEW_REF].setNativeProps(props) - }, - render() { - return ( - - ) - }, -}) - -RefreshableListView.DataSource = ListView.DataSource -RefreshableListView.RefreshingIndicator = RefreshingIndicator - -module.exports = RefreshableListView diff --git a/lib/RefreshingIndicator.js b/lib/RefreshingIndicator.js deleted file mode 100644 index 234289c..0000000 --- a/lib/RefreshingIndicator.js +++ /dev/null @@ -1,63 +0,0 @@ -var React = require('react-native') -var { - View, - Text, - ActivityIndicatorIOS, - PropTypes, - StyleSheet, - isValidElement, - createElement, -} = React - -var RefreshingIndicator = React.createClass({ - propTypes: { - activityIndicatorComponent: PropTypes.oneOfType([PropTypes.func, PropTypes.element]), - stylesheet: PropTypes.object, - description: PropTypes.oneOfType([PropTypes.string, PropTypes.element]), - }, - getDefaultProps() { - return { - activityIndicatorComponent: ActivityIndicatorIOS, - } - }, - renderActivityIndicator(style) { - var activityIndicator = this.props.activityIndicatorComponent - - if (isValidElement(activityIndicator)) { - return activityIndicator - } else { // is a component class, not an element - return createElement(activityIndicator, {style}) - } - }, - render() { - var styles = Object.assign({}, stylesheet, this.props.stylesheet) - return ( - - - - {this.props.description} - - {this.renderActivityIndicator(styles.activityIndicator)} - - - ) - }, -}) - -var stylesheet = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'space-around', - alignItems: 'center', - }, - wrapper: { - height: 60, - marginTop: 10, - }, - content: { - marginTop: 10, - height: 60, - }, -}) - -module.exports = RefreshingIndicator diff --git a/lib/createElementFrom.js b/lib/createElementFrom.js deleted file mode 100644 index 965ec6b..0000000 --- a/lib/createElementFrom.js +++ /dev/null @@ -1,16 +0,0 @@ -var React = require('react-native') -var { - cloneElement, - createElement, - isValidElement, -} = React - -function createElementFrom(elementOrClass, props) { - if (isValidElement(elementOrClass)) { - return cloneElement(elementOrClass, props) - } else { // is a component class, not an element - return createElement(elementOrClass, props) - } -} - -module.exports = createElementFrom diff --git a/lib/delay.js b/lib/delay.js deleted file mode 100644 index a823958..0000000 --- a/lib/delay.js +++ /dev/null @@ -1,5 +0,0 @@ -function delay(time) { - return new Promise((resolve) => setTimeout(resolve, time)) -} - -module.exports = delay