我希望将用户选择的值从一个视图传递到下一个视图,以便将其提交给Twitter,Facebook等。
全局变量最好实现吗?我不希望将值存储或保存在任何地方..只是通过导航控制器的末尾(提交到Facebook,Twitter等)
有什么建议吗?提前谢谢。
标题文件
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "ShareViewController.h"
#include "TwitterRushViewController.h"
@interface KindViewController : UIViewController <UIPickerViewDelegate, UIScrollViewDelegate, CLLocationManagerDelegate> {
IBOutlet UIScrollView *scrollView;
IBOutlet UIPageControl *pageControl;
BOOL pageControlIsChangingPage;
CLLocationManager *locationManager;
NSString *finalCoordinates;
NSString *finalChoice;
}
@property (nonatomic, retain) UIView *scrollView;
@property (nonatomic, retain) UIPageControl *pageControl;
@property (nonatomic, retain) CLLocationManager *locationManager;
@property (retain) NSString *finalCoordinates;
@property (nonatomic, copy) NSString *finalChoice;
-(IBAction)changePage:(id)sender;
-(IBAction)submitChoice:(id)sender;
-(void)setupPage;
@end
实施档案
#import "KindViewController.h"
#import "JSON/JSON.h"
@implementation KindViewController
@synthesize scrollView;
@synthesize pageControl;
@synthesize locationManager;
@synthesize finalCoordinates;
@synthesize finalChoice;
#pragma mark -
#pragma mark UIView boilerplate
- (void)viewDidLoad {
[self setupPage];
[super viewDidLoad];
// Alert the User on Location Access
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
self.locationManager.delegate = self;
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
}
-(void)viewWillAppear:(BOOL)animated {
[locationManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
CLLocation *location = newLocation;
NSLog(@"Our current Latitude is %f", location.coordinate.latitude);
NSLog(@"Our current Longitude is %f", location.coordinate.longitude);
NSString *Coordinates = [[NSString alloc] initWithFormat: @"Longitude=%f&Latitude=%f", location.coordinate.longitude, location.coordinate.latitude ];
NSLog(@"Test: %@", Coordinates);
finalCoordinates = Coordinates;
[locationManager stopUpdatingLocation];
}
#pragma mark -
#pragma mark The Guts
- (void)setupPage {
scrollView.delegate = self;
[scrollView setCanCancelContentTouches:NO];
scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
scrollView.clipsToBounds = YES;
scrollView.scrollEnabled = YES;
scrollView.pagingEnabled = YES;
NSUInteger nimages = 0;
CGFloat cx = 0;
for (; ; nimages++) {
NSString *imageName = [NSString stringWithFormat:@"choice%d.png", (nimages + 1)];
UIImage *image = [UIImage imageNamed:imageName];
if (image == nil) {
break;
}
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
CGRect rect = imageView.frame;
rect.size.height = image.size.height;
rect.size.width = image.size.width;
rect.origin.x = ((scrollView.frame.size.width - image.size.width) / 2) + cx;
rect.origin.y = ((scrollView.frame.size.height - image.size.height) / 2);
imageView.frame = rect;
[scrollView addSubview:imageView];
[imageView release];
cx += scrollView.frame.size.width;
}
self.pageControl.numberOfPages = nimages;
[scrollView setContentSize:CGSizeMake(cx, [scrollView bounds].size.height)];
}
#pragma mark -
#pragma mark UIScrollViewDelegate stuff
- (void)scrollViewDidScroll:(UIScrollView *)_scrollView {
if (pageControlIsChangingPage) {
return;
}
CGFloat pageWidth = _scrollView.frame.size.width;
int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
pageControl.currentPage = page;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView {
pageControlIsChangingPage = NO;
}
#pragma mark -
#pragma mark PageControl stuff
- (IBAction)changePage:(id)sender {
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * pageControl.currentPage;
frame.origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];
pageControlIsChangingPage = YES;
}
-(IBAction)submitChoice:(id)sender; {
// Spinner
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(135,140,50,50)];
[spinner startAnimating];
[self.view addSubview:spinner];
// Find the Date
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:@"MMM dd, yyyy HH:mm"];
NSDate *now = [[NSDate alloc] init];
NSString *dateString = [format stringFromDate:now];
// Echo Everything
NSLog(@"Type is %f.", scrollView.contentOffset.x);
NSLog(@"Date is %@", dateString);
NSLog(@"Coordinates are %@", finalCoordinates);
NSString *completeURL = [[NSString alloc] initWithFormat: @"http://www.example.com/insert.php?Type=%f&Time=%@&%@", scrollView.contentOffset.x, dateString, finalCoordinates];
NSString *escapedUrl = [completeURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"URL is %@.", escapedUrl);
// Post to Web Server
NSURL *urlToSend = [[NSURL alloc] initWithString:escapedUrl];
NSLog(@"NSURL is %@.", urlToSend);
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:urlToSend cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];
NSData *urlData;
NSURLResponse *response;
NSError *error;
urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
// Do the Button Action
ShareViewController *shareViewController = [[ShareViewController alloc] initWithNibName:@"ShareViewController" bundle:nil];
shareViewController.finalChoice = @"Facebook Property";
[self.navigationController pushViewController:shareViewController animated:YES];
[shareViewController release];
[urlToSend release];
[completeURL release];
[spinner release];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"There is an error updating the location");
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
[super viewDidUnload];
[pageControl release];
}
- (void)dealloc {
[super dealloc];
}
@end
ShareViewController.h
#import <UIKit/UIKit.h>
#import "MapViewController.h"
#import "SA_OAuthTwitterController.h"
#import "FBConnect/FBConnect.h"
#import "TwitterRushViewController.h"
#import "oAuth2TestViewController.h"
@class SA_OAuthTwitterEngine;
@interface ShareViewController : UIViewController <UITextFieldDelegate, SA_OAuthTwitterControllerDelegate> {
}
@property (nonatomic, retain) IBOutlet UIButton *shareFacebookBTN;
@property (nonatomic, retain) IBOutlet UIButton *shareTwitterBTN;
@property (nonatomic, retain) KindViewController finalChoice;
/* Submissions */
- (IBAction)shareNoThanks:(id)sender;
- (IBAction)shareFacebook:(id)sender;
- (IBAction)shareTwitter:(id)sender;
@end
答案 0 :(得分:2)
只需在推送它时在下一个UIViewController上设置属性可能是最简单的事情。
SomeViewController *someViewController = [[SomeViewController alloc] init];
someViewController.facebookProperty = @"Facebook Property";
someViewController.twitterProperty = @"Twitter Property";
[self.navigationController pushViewController:someViewController animated:YES];
[someViewController release];
好的,ShareViewController.h有一些问题。首先,如果您有一个属性,您还需要为该属性设置一个实例变量。接下来,您将一个字符串分配给finalChoice,但您已将其类型声明为KindViewController,它应该是NSString。
在ShareViewController.h中
@interface ShareViewController : UIViewController <UITextFieldDelegate, SA_OAuthTwitterControllerDelegate> {
NSString *finalChoice;
}
@property (nonatomic, retain) IBOutlet UIButton *shareFacebookBTN;
@property (nonatomic, retain) IBOutlet UIButton *shareTwitterBTN;
@property (nonatomic, copy) NSString *finalChoice;
并确保在实现文件中@synthesize finalChoice。
答案 1 :(得分:0)
在不知道任何细节的情况下,我会避免使用全局变量或将两个视图紧密耦合在一起。
根据您的需求和实施情况,delegation或notifications可能是在视图之间传递变量的更好选择。
答案 2 :(得分:0)
关于如何在视图控制器over here之间进行最佳通信的更一般问题,有一个很好的讨论。最高投票的答案非常好。
tl; dr版本基本上是:
希望有所帮助。