【问题标题】:Passing a Value Through a Navigation Controller通过导航控制器传递值
【发布时间】:2011-01-09 20:56:23
【问题描述】:

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

【问题讨论】:

    标签: iphone variables uiview uinavigationcontroller


    【解决方案1】:

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

    【讨论】:

    • 谢谢亚伦!我如何在下一个视图中调用它?我使用@synthesize 吗?
    • 是的,它们应该被定义为 SomeViewController 中的属性,例如有一个名为 NSString *facebookProperty 的实例变量和一个属性 @property (nonatomic, copy) NSString *facebookProperty。然后你应该在实现文件中合成它。
    • 嗨亚伦...谢谢!这正是我在文件中的内容.. 但我收到以下错误“请求成员“facebookProperty”不是结构或联合。”我编辑了答案以包含我的代码。
    • 嗯,我不确定,那里发生了一些奇怪的事情。我建议简化你所拥有的,看看你是否能让它工作。如果您仍然没有运气,那么可能会发布更多代码。
    • 我仍在试图弄清楚...但我已经更新了我的答案以包含我的整个实现文件。
    【解决方案2】:

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

    根据您的需要和实现,delegationnotifications 可能是在视图之间传递变量的更好选择。

    【讨论】:

    • 谢谢马特!感谢您的快速响应。
    【解决方案3】:

    关于如何最好地在视图控制器over here 之间进行通信的更一般的问题进行了很好的讨论。票数最高的答案很不错。

    tl;dr 版本基本上是:

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

    希望对您有所帮助。

    【讨论】:

    • 谢谢zbrimhall!我会仔细看看。
    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2016-07-25
    • 2015-02-10
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多