У меня есть следующая настройка в одном из моих классов, где я передаю NSMutableDictionary
в качестве параметра инициализатору, а затем присваиваю его переменной controls
.
Я считаю, что поведение заключается в копировании элементов NSMutableDictonary
в controls
, но мне нужно передать его как ссылку, чтобы внесенные изменения отражались в классе, который передает словарь в MenuViewCell
. Это всегда меня чертовски смущает, как бы я передал NSMutableDictionary
в качестве ссылки?
MenuViewCell.h
@interface MenuViewCell : UITableViewCell
{
NSMutableDictionary *_controls;
}
@property(nonatomic, copy) NSMutableDictionary *controls;
MenuViewCell.m
@synthesize controls = _controls;
- (id)initWithControls:(NSMutableDictionary *)controls
{
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
if (self)
{
self.controls = controls;
}
return self;
}
- (void) setControls:(NSMutableDictionary *)controls
{
if (_controls != controls)
{
_controls = [controls mutableCopy];
}
}
Ваша проблема заключается в использовании copy
в свойстве и использовании mutableCopy
в установщике. Сделайте свойство strong
.
Вам также не нужны @synthesize
или явная переменная экземпляра.
MenuViewCell.h
@interface MenuViewCell : UITableViewCell
@property(nonatomic, strong) NSMutableDictionary *controls;
MenuViewCell.m
- (id)initWithControls:(NSMutableDictionary *)controls
{
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
if (self)
{
_controls = controls;
}
return self;
}
Нет необходимости переопределять сеттер.
Спасибо, по какой-то причине у меня были шоры, когда я думал, что вы можете заявить об этом только с помощью копии.
copy
очень распространен, потому что во многих случаях вам нужна реальная копия, чтобы изменения в оригинале не испортили свойство. Но, очевидно, в вашем случае вы хотите, чтобы изменения появились.
[self.controls setObject:control forKey: subtypeNumber]; Это все еще должно работать, и я должен увидеть изменения в родительском классе? По какой-то причине это не работает для меня, я могу вытащить объект с помощью ключа, но когда я пытаюсь что-то сделать с ним (например, установить текст меток), ничего не происходит.
Пожалуйста, опубликуйте новый вопрос с достаточными подробностями, демонстрирующими проблему, с которой вы столкнулись.
Я бы рекомендовал использовать модель вместо словаря. Также удалите строку
NSMutableDictionary *_controls;
и создайте свойствоstrong
вместоcopy
. Когда вы делаете копию, она не сохраняет ту же ссылку, только назначение будет работать.