2013-07-29 40 views
-1

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

应用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调用的。请解释。

+0

你如何获得银行的实例中,失败的案例? – Wain

+0

@Wain - (Bank *)daBank { if(!daBank){daBank = [[Bank alloc] init]; } \t \t return daBank; } – luca590

回答

0

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

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

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

    return self; 
} 
+0

这对你最初设置的'myDate'如何工作? – Wain

0

你永远不会保存你的daBank实例,所以它可能被破坏。因此,当您尝试获取银行详细信息时(您没有举例说明),您在请求实例时可能获得nil,或者您正在创建新实例(该实例不具有任何你期待的设置,因为它是新的)。

应用程序委托人通常不是持有类似信息的地方,但您需要一些对象成为银行实例的所有者,以便在任何人需要时,他们会转到该所有者并要求实例。


你额外的代码(虽然有点不清楚,由于投)通常表明你正在创建一个新的实例。

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


General intro guideObjective-C overviewSpecifically sending and receiving messages

+0

应用程序委托是这类信息的最佳场所,因为我使用的CoreData结构像AppDataDelegate一样在大多数其他CoreData结构中实现NSManagedObjectContext。本教程来自Apple [链接](http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/iPhoneCoreData01/Articles/01_StartingOut.html)将managedObjectContext属性赋予它的主类,在尝试(但明显失败)在这里做。 – luca590

+0

其实我懂了。我认为你是对的,而且我已经完成了复杂的事情。我刚刚在银行的初始化程序中初始化了Bank的managedObjectContext,现在它的工作正常。 – luca590

+0

应用程序委托不是正确的位置,并且将托管对象上下文放在应用程序委托中并不一定是正确的解决方案。这是'工作'和'正确'之间的区别。 – Wain

相关问题