@property не установлен в новое значение - PullRequest
1 голос
/ 16 февраля 2012

У меня есть один класс в качестве модели - фильтр.Мне нужно получить доступ к этой модели с моего контроллера.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, это все еще 'НЕТ'.Где ошибка?Спасибо

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Покажите немного больше о вашей реализации фильтра. Там может быть куча вещей, в результате чего свойство не будет установлено. В частности, тот факт, что это не в вашем общедоступном интерфейсе.

@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! Другими словами, убедитесь, что вы действительно устанавливаете то, что хотите установить. Неявный iVar теперь автоматически объявляется для всех свойств, начиная с iOS SDK 3.0 или, возможно, ранее. Правило большого пальца, убивайте iVars в своем коде и работайте только со свойствами.

0 голосов
/ 16 февраля 2012

Похоже, вы вызываете setVirtualShowProperty: перед вызовом navigationController.filter = someFilter;.

Тот факт, что вы устанавливаете логическое значение на YES и по-прежнему видите, что оно равно NO, вводит в заблуждение - это не совсем НЕТ, просто объект, на который вы его устанавливаете, вероятно, равен нулю.

Вы должны убедиться, что ваш объект navigationController.filter действительно не равен nil, когда вы переходите к setVirtualShowProperty:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...