2012-02-16 22 views
1

モデル - フィルタとして1つのクラスがあります。私はコントローラからこのモデルにアクセスする必要があります。 Filter.h私のコントローラで@propertyが新しい値に設定されていません

@interface Filter : NSObject 

@property (nonatomic, assign) BOOL name; 

@end 

@implementation NavigationController 

@synthesize filter = _filter; 

- (IBAction)setVirtualShowProperty:(UISwitch*)sender { 
    self.filter.virtualRoomSet = YES; 
    _filter.virtualRoomSet = YES; // I dont know which syntax is better 
    } 
@end 

しかし、それはそれは 'NO' まだあるvirtualRoomSet更新does notの。バグはどこですか?ありがとう

+0

virtualRoomSetはどこに定義されていますか? – rooftop

+0

名前やvirtualRoomSetが誤植ですか? –

+0

'filter'を初期化しましたか? –

答えて

0

あなたはsetVirtualShowPropertyを呼び出すようです:navigationController.filter = someFilter;を呼び出す前。

ブール値をYESに設定してもそれがNOであるという事実は、誤解を招きます。実際にはそうではありません。設定しているオブジェクトはおそらくゼロです。

setVirtualShowProperty:になると、navigationController.filterオブジェクトが実際にはnilでないことを確認する必要があります。

1

もう少しフィルタの実装を見せてください。プロパティが設定されない原因となるものがたくさんある可能性があります。最も顕著なのは、あなたのパブリックインターフェイスにないということです。

@interface Filter : NSObject 

@property (nonatomic, assign) BOOL name; 
@property (nonatomic, assign) BOOL virtualRoomSet; 

@end 

それを置くと違いはありませんが、オブジェクトの意図をより明確にする必要があります。お使いのコントローラの実装について:

#import "Filter.h" 

@implementation NavigationController 

@property (nonatomic, retain) Filter *filter; 

@end 

@implementation NavigationController 

@synthesize filter; 

//assuming you've properly alloced in init... 

-(void) dealloc 
{ 
    [filter release]; 
    [super dealloc]; 
} 

- (IBAction)setVirtualShowProperty:(UISwitch*)sender { 
    self.filter.virtualRoomSet = YES; //better syntax as dealing directly w/ iVars is error prone 

} 
@end 

プロパティを使用する代わりにアイバーズにアクセスすると、直接あなたが書かなければならないメモリMGMTコードの量を減らし、必要に応じてオブジェクトを共同で/ wのアイバーズを交換する機能を提供します。私は通常、暗黙のうちに仮定されているので、iVarsをまとめて宣言することは避けます。それはあなたを "@synthesize myVar = _myVar;"醜さ。

あなたのフィルタでこのようなものがある場合:あなたのフィルタの実装で

@interface Filter : NSObject { 
    BOOL _virtualRoomSet; 
} 

@property (nonatomic, assign) BOOL name; 
@property (nonatomic, assign) BOOL virtualRoomSet; 

@end 

そして、この:

@implementation Filter 
@synthesize filter; 

//other code 

@end 

を...それは、さらに上記の私の点を強調しているバグを、説明できますiVarsの宣言を避けることについて!言い換えれば、実際にあなたが設定したいものを設定していることを確認してください。暗黙のiVarは、iOS SDK 3.0以降、またはおそらく以前のバージョンから、すべてのプロパティに対して自動的に宣言されるようになりました。経験則では、コード内のiVarsを削除し、プロパティのみを処理します。

関連する問題