这是我自己尝试做的第一个应用程序,我有一些问题。我希望有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
那你能建议我解决吗?
答案 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很好地证明了这个概念是如何运作的。