通过导航控制器传递值
我希望将用户选择的值从一个视图传递到下一个视图,以便可以将其提交到 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
I'm looking to pass a user chosen value from one view to the next so it can be submitted to Twitter, Facebook, etc.
Would a global variable be best to implement? I don't want the value to be stored or saved anywhere.. just to make it through the end of the navigation controller (submission to Facebook, Twitter, etc.)
Any suggestions? Thanks in advance.
Header File
#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
Implementation File
#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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
当你推送下一个 UIViewController 时,只需在它上设置一个属性可能是最简单的事情。
好吧,ShareViewController.h 有一些问题。首先,如果您有一个属性,您还需要有该属性的实例变量。接下来,您将一个字符串分配给 FinalChoice,但您已将其类型声明为 KindViewController,它应该是 NSString。
在 ShareViewController.h 中
并确保在实现文件中 @synthesize FinalChoice 。
Just setting a property on the next UIViewController when you push it would probably be the easiest thing to do.
Ok there are a few things wrong with ShareViewController.h. First if you have a property you also need to have an instance variable for that property. Next you are assigning a string to finalChoice but you have declared its type as KindViewController it should be NSString.
In ShareViewController.h
And make sure you @synthesize finalChoice in your implementation file.
在不了解任何细节的情况下,我会避免使用全局变量或将两个视图紧密耦合在一起。
根据您的需求和实现,委托 或通知 可能是在视图之间传递变量的更好选择。
Without knowing any of the specifics, I would avoid a global variable or tightly coupling the two views together.
Depending on your needs and implementation, delegation or notifications may a better choice to pass a variable between views.
关于如何在视图控制器之间进行最佳通信的更普遍的问题有一个很好的讨论 在这里。得票最高的答案非常好。
tl;dr 版本基本上是:
希望有帮助。
There's a good discussion on the more general problem of how best to communicate between view controllers over here. The top-voted answer is pretty good.
The tl;dr version is basically:
Hope that helps.