我有一个类作为模型 - 过滤器。我需要从我的控制器访问这个模型。 Filter.h
@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
但它没有更新virtualRoomSet它仍然是'NO'。虫子在哪里?感谢
答案 0 :(得分: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
使用属性而不是直接访问iVars会减少您必须编写的内存管理代码量,并且可以根据需要替换具有协作对象的iVars。我通常会避免一起声明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的观点!换句话说,请确保您实际上正在设置要设置的内容。现在,对于iOS SDK 3.0或更早版本,所有属性都会自动声明隐式iVar。经验法则,在代码中杀死iVars并仅处理属性。
答案 1 :(得分:0)
看起来你正在调用setVirtualShowProperty:在调用navigationController.filter = someFilter;。
之前你将布尔值设置为YES并且仍然看到它是NO的事实是误导性的 - 它不是真的没有,只是你设置它的对象可能是零。
当你到达setVirtualShowProperty时,你应该确保你的navigationController.filter对象确实不是nil。: