在iOS中的选项卡之间传递数据

时间:2012-08-27 15:52:21

标签: objective-c ios cocoa-touch tabs

这是我自己尝试做的第一个应用程序,我有一些问题。我希望有4个选项卡,在第一个名为“HomeView”的选项卡中,我正在解析JSON数据(到目前为止已完成)。

但我想要的是一些被解析为在其他标签中可见的数据(而不必再次解析它们)。

因此,我的HomeView代码部分在这里:

#import "HomeView.h"

@interface HomeView ()
@end

@implementation HomeView


//other code

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
//data fetched
parsed_date=[res objectForKey:@"date"];
 NSLog(@"Date:%@",parsed_date);
[UIAppDelegate.myArray  addObject:parsed_date];
        }

我可以看到正确打印出“parsed_date”。

所以我希望这个parsed_date在OtherView中可见。

这是我的代码,但我无法打印出来。

OtherView.m

#import "OtherView.h"
#import "HomeView.h"
#import "AppDelegate.h"

@interface OtherView ()

@end

@implementation OtherView
@synthesize tracks_date;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //preview value of other class
   tracks_date = [UIAppDelegate.myArray objectAtIndex:0];
NSLog(@"Dated previed in OtherView: %@", tracks_date);
}

和(null)正在打印出来。

添加了app delegate.h的代码

#import <UIKit/UIKit.h>

#define UIAppDelegate ((AppDelegate *)[UIApplication sharedApplication].delegate)

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong) NSArray *myArray;

@end

那你能建议我解决吗?

4 个答案:

答案 0 :(得分:11)

将属性添加到Application Delegate中。

分配属性时,请执行以下操作:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

delegate.myProperty = @"My Value";

然后,在不同的标签中,您可以采用相同的方式检索此属性:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *valueInTab = delegate.myProperty; 

答案 1 :(得分:2)

呃,当你在那里的最后一个代码段中创建一个HomeView时,你要创建一个新对象 - 该类的一个新实例。它不会包含来自connectionDidFinishLoading的数据,除非该方法在该类的实例中执行。

你基本上需要使用某种持久性机制来做你想要的事情,AppDelegate或静态存储沿着&#34;单身&#34;。

答案 2 :(得分:1)

虽然这可能不是最好的方法,但这很简单有效。

将您的数据保存在您的应用委托中并从那里检索。您可以创建应用委托共享应用程序的快捷方式。然后只需访问那里的值。

AppDelegate.h

#define UIAppDelegate ((AppDelegate *)[UIApplication sharedApplication].delegate)

@property (nonatomic, strong) NSArray *myArray;

TabView1.m

#import "AppDelegate.h"

SomeObject *myObject = [UIAppDelegate.myArray objectAtIndex:0];

就像我说的,它可能不是为您的应用程序组织数据的最佳方式,此方法适用于需要在应用程序级别共享的少量数据。希望这会有所帮助。

答案 3 :(得分:1)

这是因为您自己创建了HomeView的实例。 它根本没有任何联系。
你的第一个例子是有效的,因为它是从你的笔尖创建并初始化的。

我认为最好的方法是使用IBOutlet,然后在InterfaceBuilder中连接两个“视图”。

@interface OtherView ()
    IBOutlet HomeView *homeView;
@end

@implementation OtherView
@synthesize tracks_date;

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"Dated previed in OtherView: %@", homeView.parsed_date);
}

- (void)dealloc:
{
    [homeView release];
}

have a look here, it will demonstrate it much more

在InterfaceBuilder中,您可以管理对象并将它们(通过IBOutlets和IBAction,...)连接在一起。

我认为this video很好地证明了这个概念是如何运作的。