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 を使用していることがわかります。

ViewController では、アニメーション マネージャーと、Section という UIView の一連のサブクラスをインスタンス化します。それぞれで、データ (x/yw/h、タイトルなど) をディクショナリに保存し、それをアニメーション マネージャーで宣言されたディクショナリに渡します。Section クラスでは、アニメーション マネージャーもインスタンス化し、メソッドを呼び出す UITapGestureRecognizer を追加します。このメソッドは、どのセクションがタップされたかをアニメーション マネージャーのメソッド (checkToggleStatus) に渡します。

メソッドでわかるように、sectionData をログに記録しているだけです。問題は、値が null になっていることです。

シングルトンに対する私の理解が間違っているのかもしれません。私の仮定は、クラスがインスタンス化されるのは一度だけで、すでにインスタンス化されている場合は、その既存のオブジェクトが返されるということでした。

他のすべてのセクション クラスのデータが必要です。これは、タップされたセクションをアニメーション マネージャーに渡し、[[セクション スーパービュー] サブビュー] を実行してループし、それぞれからデータを取得することで回避できます。そのようにしますが、そのデータは作成時に ViewController で使用できるため、冗長に見えます。

そのデータを転送しようとして何か間違ったことをしていますか? より良い解決策はありますか?私は提案と批判を受け入れます。

ありがとう

4

1 に答える 1

1

hファイル

@interface OAI_AnimationManager : NSObject 

@property (nonatomic, retain) NSMutableDictionary* sectionData;

+(OAI_AnimationManager* )sharedAnimationManager;

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

@end

mファイル

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 変数をヘッダーから移動し、実装ファイルに移動したことに注意してください。少し前に、プロパティを合成し、それに沿ってインスタンス変数名を指定できる場所に変更しました...したがって:

sectionData = _sectionData;

また、インスタンス変数にアンダースコアを追加しました...これはプライベート変数の普遍的な規則であり、checkToggleStatus: の return ステートメントで行ったようにsectionDataだけを入力しようとすると、コンパイル エラーがスローされます。ここで、self.sectionDataまたは_sectionDataと入力する必要があります。

辞書のインスタンスを作成するコードは含まれていませんでしたが、それをself.sectionData = [[NSDictionary alloc] init]として設定しなかったに違いありません。これは、値が保持されず、次の値が null になることを意味しますあなたがそれを呼んだ時間。古典的なメモリ管理の間違い...私は苦労して学んだのでよく知っています。

于 2012-10-15T15:29:22.177 に答える