通过导航控制器传递值

发布于 2024-10-11 10:53:35 字数 7480 浏览 2 评论 0原文

我希望将用户选择的值从一个视图传递到下一个视图,以便可以将其提交到 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

↘人皮目录ツ 2024-10-18 10:53:35

当你推送下一个 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 。

Just setting a property on the next UIViewController when you push it would probably be the easiest thing to do.

SomeViewController *someViewController = [[SomeViewController alloc] init];
someViewController.facebookProperty = @"Facebook Property";
someViewController.twitterProperty = @"Twitter Property";
[self.navigationController pushViewController:someViewController animated:YES];
[someViewController release];

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

@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;

And make sure you @synthesize finalChoice in your implementation file.

葮薆情 2024-10-18 10:53:35

在不了解任何细节的情况下,我会避免使用全局变量或将两个视图紧密耦合在一起。

根据您的需求和实现,委托 或通知 可能是在视图之间传递变量的更好选择。

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.

挽袖吟 2024-10-18 10:53:35

关于如何在视图控制器之间进行最佳通信的更普遍的问题有一个很好的讨论 在这里。得票最高的答案非常好。

tl;dr 版本基本上是:

  1. 全局变量和单例类很少是正确的答案。
  2. 阅读“依赖注入”设计模式。

希望有帮助。

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:

  1. Global variables and singleton classes are rarely the right answer.
  2. Read up on the "dependency injection" design pattern.

Hope that helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文