0

我有一个单例,我想用它来管理我的视图的屏幕动画。这是我的。

#import <Foundation/Foundation.h>

@interface OAI_AnimationManager : NSObject {

    NSMutableDictionary* sectionData;
}

@property (nonatomic, retain) NSMutableDictionary* sectionData;

+(OAI_AnimationManager* )sharedAnimationManager;

- (void) checkToggleStatus : (UIView* ) thisSection;

@end

.m 文件

#import "OAI_AnimationManager.h"

@implementation OAI_AnimationManager

@synthesize sectionData;

+(OAI_AnimationManager *)sharedAnimationManager {

static OAI_AnimationManager* sharedAnimationManager;

@synchronized(self) {

    if (!sharedAnimationManager)

        sharedAnimationManager = [[OAI_AnimationManager alloc] init];

    return sharedAnimationManager;

}

}

- (void) checkToggleStatus : (UIView* ) thisSection {

    //get the section data dictionary
     NSLog(@"%@", sectionData);

}



@end

您将在 .h 文件中看到我添加了一个 NSMutableDictionary 并使用 @property/@synthesize 作为它的 getter 和 setter。

在我的 ViewController 中,我实例化了动画管理器以及一系列名为 Section 的 UIView 子类。对于每一个,我都将数据(x/yw/h、标题等)存储在字典中,并将其传递给动画管理器中的字典。在 Section 类中,我还实例化了动画管理器并添加了一个 UITapGestureRecognizer,它调用一个方法,该方法将哪个部分传递给动画管理器中的方法 (checkToggleStatus)。

正如您在我只是记录sectionData 的方法中看到的那样。问题是我的值是空的。

也许我对单例的理解是错误的。我的假设是该类只会被实例化一次,如果它已经被实例化,那么将返回现有的对象。

我确实需要所有其他 Section 类数据,就好像一个动画其他动画响应一样,我可以通过将点击的 Section 传递给动画管理器并执行 [[Section superview] subviews] 然后循环并从每个获取数据来绕过它这种方式,但它似乎是多余的,因为数据在创建时 ViewController 中可用。

我在尝试传输该数据时做错了什么?有更好的解决方案吗?我愿意接受建议和批评。

谢谢

4

1 回答 1

1

h 文件

@interface OAI_AnimationManager : NSObject 

@property (nonatomic, retain) NSMutableDictionary* sectionData;

+(OAI_AnimationManager* )sharedAnimationManager;

- (void) checkToggleStatus : (UIView* ) thisSection;

@end

文件

static OAI_AnimationManager* _sharedAnimationManager;

@implementation OAI_AnimationManager

@synthesize sectionData = _sectionData;

+(OAI_AnimationManager *)sharedAnimationManager {


    @synchronized(self) {

        if (!_sharedAnimationManager) {

            _sharedAnimationManager = [[OAI_AnimationManager alloc] init];
        }
    }

    return _sharedAnimationManager;

}


- (void) checkToggleStatus : (UIView* ) thisSection {

     //get the section data dictionary

     NSLog(@"%@", _sectionData);

}

@结尾

请注意,我将您的 sectionData 变量从标头中移到了实现文件中。不久前,他们将其更改为您可以合成属性并在其旁边指定它们的实例变量名称的位置......因此:

截面数据 = _截面数据;

我还在实例变量中添加并下划线...这是私有变量的通用约定,如果您尝试像在 checkToggleStatus 的返回语句中所做的那样仅键入sectionData,它现在也会引发编译错误:。现在您必须输入self.sectionData_sectionData

您没有包含创建字典实例的代码,但我敢打赌您没有将其设置为self.sectionData = [[NSDictionary alloc] init]这意味着它不会保留该值,并且下一次您将获得 null你叫它的时间。经典的内存管理错误......我很清楚,因为我学会了艰难的方式嘿嘿嘿

于 2012-10-15T15:29:22.177 回答