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