2012-02-26 71 views
-1

这是我最后一个的后续问题:iOS: Initialise object at start of application for all controllers to useiOS上无法访问全局实例(由工厂构建)

我已经设置我的应用程序,如下所示(忽略DB前缀):

DBFactoryClass  // Built a DataManaging Object for later use in the app 
DBDataModel  // Is created by the factory, holds all data & access methods 
DBViewControllerA // Will show some of the data that DBDataModel holds 
moreViewControllers that will need access to the same DBDataModel Object 

我将通过应用走一步看一步,然后在最后

AppDelegate中发布问题。^h

#import "DBFactoryClass.h" 

AppDelegate.m

- (BOOL)...didFinishLaunching... 
{ 
    DBFactoryClass *FACTORY = [[DBFactoryClass alloc ]init ]; 
    return YES; 
} 

DBFactoryClass.h

#import <Foundation/Foundation.h> 
#import "DBDataModel.h" 

@interface DBFactoryClass : NSObject 
@property (strong) DBDataModel *DATAMODEL; 
@end 

DBFactoryClass.m

#import "DBFactoryClass.h" 

@implementation DBFactoryClass 
@synthesize DATAMODEL; 

-(id)init{ 
    self = [super init]; 
    [self setDATAMODEL:[[DBDataModel alloc]init ]]; 
    return self; 
} 

@end 

ViewControllerA.h

#import <UIKit/UIKit.h> 
#import "DBDataModel.h" 

@class DBDataModel; 
@interface todayViewController : UIViewController 
@property (strong)DBDataModel *DATAMODEL; 
@property (weak, nonatomic) IBOutlet UILabel *testLabel; 
@end 

ViewControllerA.m

#import "todayViewController.h" 

@implementation todayViewController 
@synthesize testLabel; 
@synthesize DATAMODEL; 

- (void)viewDidLoad 
{ 
    todaySpentLabel.text = [[DATAMODEL test]stringValue]; // read testdata 
} 
@end 

DBDataModel.h

#import <Foundation/Foundation.h> 

@interface DBDataModel : NSObject 
@property (nonatomic, retain) NSNumber* test; 
@end 

DBDataModel.m

#import "DBDataModel.h" 

@implementation DBDataModel 
@synthesize test; 
-(id)init{ 
    test = [[NSNumber alloc]initWithInt:4];  // only a testvalue 
    return self; 
} 
@end 

应用程序建立的罚款,并开始了,但标签保持空白。所以要么这个对象不存在(但我想这会导致一个错误信息),或者其他的错误与我的设置。有什么想法吗?

回答

1

有两点需要注意:

  1. 你拥有了一个试探性的方法来提出问题:每次你打的绊脚石,你问一个问题,如果回答不立即工作,你问一个又一个。您必须在调试问题和自行编写代码之间花费一些精力,否则您将永远依赖外部帮助。

  2. 请使用通用的编码风格。 CAPS保留给宏。

我们的代码:

- (BOOL) …didFinishLaunching… 
{ 
    DBFactoryClass *factory = [[DBFactoryClass alloc] init]; 
    return YES; 
} 

这只是简单的创建DBFactoryClass的一个实例,然后它扔了出去。换句话说,它本质上是一个无操作。通过上一个答案中的评论来判断,使用故事板功能创建控制器。他们应该如何接收对数据模型的引用?该参考不会由魔法显示,您必须将其分配到某处。

我不熟悉故事板功能。我要做的方式是使用单独的XIB文件创建视图控制器,然后可以在Factory类中创建控制器实例,并将所需的引用传递给模型。最后,应用程序委托会创建工厂,请求它组装主控制器,然后将其设置为窗口的根视图控制器。就像在我的sample project。有可能有一种方法可以使它与故事板一起工作,但正如我所说的,我并不熟悉它们。

+0

嗨 - 感谢您的建议 - 我会从头开始,故事板似乎隐藏太多,我实际上看到了什么事情:) – 2012-02-26 17:18:12

+0

一个即时通讯对不起一个非常老的电话和错误,我再次在我的笔记本电脑上修复它,不知何故,我无法切换从移动的投票。 – 2012-02-26 17:19:32

+0

我管理它=) 我写了一个自己的tabbarcontroller,让工厂创建所有的意见,并直接添加到他们所有的公共数据模型,然后将它们发送到tabbarcontroller。 一个非常小的问题:为什么你把@class放在示例项目中的一些文件中 - 我把它留在了外面,它工作得很好? – 2012-02-26 18:14:19