5

这是我自己尝试做的第一个应用程序,我有一些问题。我想要 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 中可见。

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

其他视图.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) 正在被打印出来。

添加了应用程序 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

4 回答 4

11

而是将该属性添加到您的应用程序委托中。

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

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

delegate.myProperty = @"My Value";

然后,在您的不同选项卡中,您可以以相同的方式检索此属性:

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *valueInTab = delegate.myProperty; 
于 2012-08-27T15:59:00.513 回答
2

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

您基本上需要使用某种持久性机制来做您想做的事情,无论是 AppDelegate 还是沿着“单例”行的静态存储。

于 2012-08-27T16:01:18.687 回答
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];

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

于 2012-08-27T15:59:47.620 回答
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];
}

看看这里,它将展示更多

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

我认为这个视频很好地展示了这个概念是如何工作的。

于 2012-08-27T16:03:47.087 回答