从appDelegate设置另一个类的属性

时间:2013-07-29 06:14:30

标签: ios properties appdelegate

我正在尝试从appDelegate简单地设置一个名为“Bank”的类的属性,但它没有像我想象的那样工作。不知何故,appDelegate类中的属性设置得很好,所以只要我从appDel调用属性就可以了,但是只要我从任何其他类调用这些属性,它们就会返回null。这是所有相关的代码。

App Del.m

#import "MusikerAppDelegate.h"
#import "MusikerViewController.h"

@implementation MusikerAppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;
@synthesize tbc;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // Override point for customization after application launch.
    AudioTableViewController *ATVC = [[AudioTableViewController alloc] init];
    MusikerViewController *MusicVC = [[MusikerViewController alloc] init];
    tbc = [[UITabBarController alloc] init];
    tbc.viewControllers = [NSArray arrayWithObjects: MusicVC, ATVC, nil];

    [ATVC release];
    [MusicVC release];

    Bank *daBank = [[Bank alloc] init];

    NSManagedObjectContext *context = [self managedObjectContext];
        daBank.managedObjectContext = context;
    daBank.myDate = [NSDate date];

    if (!daBank.myDate) {
        NSLog(@"no date at point A");
    } else {
        NSLog(@"Date at appDel : %@",daBank.myDate);
    }

    if (!daBank.managedObjectContext) {
        NSLog(@"PROBLEM. NO MANAGED OBJECT CONTEXT!! -MUSIKER APP DELEGATE at point A");
    }
    else {
        NSLog(@"ManagedObjectContext created at point A");
        NSLog(@"Context: %@",daBank.managedObjectContext);
        NSLog(@"PS Coord : %@",daBank.managedObjectContext.persistentStoreCoordinator);
        NSLog(@"MOM : %@", daBank.managedObjectContext.persistentStoreCoordinator.managedObjectModel);
        NSLog(@"Entities : %@",[[daBank.managedObjectContext.persistentStoreCoordinator.managedObjectModel entities] valueForKey:@"name"]);
    }


    self.window.rootViewController = self.viewController;
    [self.window addSubview:tbc.view];
    [self.window makeKeyAndVisible];
    return YES;
}

...(更多方法) 不,当我调用NSLog打印日期,NSManagedObject等时,它会打印所有已初始化并完美运行的内容。

这是包含要设置的属性的类。 Bank.h

#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
#import "AudioFile.h"
#import "AudioTableViewController.h"
#import "MusikerAppDelegate.h"

@interface Bank : NSObject {
    NSManagedObjectContext *managedObjectContext;
     NSDate *myDate;
     NSString *recPath;
}

@property (retain, nonatomic) NSManagedObjectContext   *managedObjectContext;
@property (nonatomic, retain) NSDate                   *myDate;
@property (retain, nonatomic) NSString                 *recPath;
//@property (copy) NSString *docPath;

- (id)init;

+ (NSString *)getDataPath:(NSString *)fileExtDate;

-(BOOL)addAudioFileEntityToModel;
-(BOOL)removeAudioFromModel:(id)audio;
-(NSMutableArray *)getFetchArray;

@end

和实施文件 Bank.m

//
//  Bank.m
//  Musiker
//
//  Created by Lucas Gaylord on 7/7/13.
//  Copyright 2013 __MyCompanyName__. All rights reserved.
//

#import "Bank.h"
//#import "AudioFile.h"

@implementation Bank
@synthesize managedObjectContext;
@synthesize myDate;
@synthesize recPath;
//@synthesize docPath = _docPath;


- (NSMutableArray *)getFetchArray {

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    if(!managedObjectContext) {
        //handel error
    }

    NSLog(@"AT PLACE A");

    NSLog(@"Context: %@",managedObjectContext);
    NSLog(@"PS Coord : %@",managedObjectContext.persistentStoreCoordinator);
    NSLog(@"MOM : %@", managedObjectContext.persistentStoreCoordinator.managedObjectModel);
    NSLog(@"Entities : %@",[[managedObjectContext.persistentStoreCoordinator.managedObjectModel entities] valueForKey:@"name"]);

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"AudioFile" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptors release];
    [sortDescriptor release];

    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil) {
        // Handle the error.
    }
    [request release];

    return mutableFetchResults;
}

...(更多方法) 现在,当我调用NSLog打印我在appDel中设置的相同属性时,它们都返回null。这种情况发生在我在appDel之外的任何地方。

我不知道问题是什么。我试过调用self.managedObjectContext。我在Bank.m实施之前尝试过@class MusikAppDelegate。我已经在我的应用程序的每个类中将属性打印到控制台,但它们总是返回null,除非它们是从appDel调用的。请解释一下。

2 个答案:

答案 0 :(得分:0)

您似乎永远不会保存您的daBank实例,因此可能会被销毁。因此,当您尝试获取银行详细信息(您没有显示示例)时,您可能在请求实例时获得nil,或者您正在创建新实例(不会有你想要的任何设置,因为它是新的。)

应用程序代表通常不是保存此类信息的地方,但您需要一些对象作为您的银行实例的所有者,以便当有人需要时,他们会转到该所有者并要求该实例。


您的其他代码(虽然因演员而有点不清楚)通常会显示您正在创建新实例。

考虑将您的银行实例从应用程序委托传递到根视图控制器,然后让根视图控制器将其传递给它创建的任何其他需要它的视图控制器。


General intro guideObjective-C overviewSpecifically sending and receiving messages

答案 1 :(得分:0)

在Bank的初始化程序中初始化managedObjectContext和其他属性修复了它。

- (id)init {
    self = [super init];

    if (self) {
    MusikerAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
        NSManagedObjectContext *context = [appDelegate managedObjectContext];
        self.managedObjectContext = context;
    }

    return self;
}