将NSMutableDictionary添加到NSMutableArray - iOS,Objective - C

时间:2015-11-13 11:52:39

标签: objective-c nsmutablearray nsarray nsdictionary nsmutabledictionary

在ViewController(A)中,我创建了一个属性,如下所示:

@property (strong, nonatomic) NSMutableArray *someList;

在另一个ViewController(B)中,NSMutableDictionary的一个实例被添加到someList属性中,但它总是给出null。请帮忙。 在B中,

A = [[A alloc] init];
[A.someList addObject:someInitializedMutableDictionary];

3 个答案:

答案 0 :(得分:1)

您需要分配- (void)menuButtonPressed { [self presentViewController:self.menuAlert animated:YES completion:nil]; self.menuAlert.view.tintColor = COLOR_BACKGROUND_GREEN; } 属性,该属性通常在子类的someList方法中完成。但是,存在一个问题,即视图控制器的init方法通常不在子类中实现,并且在init中首选这种类型的东西。

因此我建议您创建一种方法来向viewDidLoad添加内容,如下所示:

someList

,只要需要添加某些内容,就会分配@implementation A ... - (void)addToSomeList:(id)object { if (!_someList) _someList = [NSMutableArray new]; [_someList addObject:object]; }

答案 1 :(得分:0)

someList是否会被初始化?你不能添加一些不存在的东西。

你必须说:

self.someList = [[NSMutableArray alloc] init];

self 当然只有在ViewController A中执行此操作时

答案 2 :(得分:0)

您的方法的基本问题是集合属性不应该是可变的。它有几个问题。所以,首先让我们改变这一点。另外,你必须添加变异方法(mutators)。

@interface MyClass
@property (readonly, nonatomic) NSArray *items;                   // Better naming
-(void)insertObject:(Item*)item inItemsAtIndex:(NSUInteger)index; // See below
@end

这样做有两个“问题”:

  • 如何改变财产?
  • 伊娃也不是一成不变的吗?

可变的ivar

要获得可变的ivar,只需在实现中声明它:

@implementation MyClass
{
  NSMutableArray _items;
}

此ivar将由合成属性使用,因为它具有正确的名称和合法类型(属性的子类)。

你可以在对象生命周期的早期初始化那个ivar,i。即-init-viedDidLoad,$等等。或者你可以在访问器方法中懒散地进行(例如在trojanfoe的答案中)。

此外,如果在.m-File中添加类继续,将属性转换为读/写,则可以在内部设置setter。

如果你有一个setter,你应该明确定义有一个可变副本:

-(void)setItems:(NSArray*)items // Arg type from property
{
  _items = [items mutableCopy];
}

<强>更改

您应该实施几种KVC方法。您可以找到列表here。 I. e。:

-(void)insertObject:(Item*)item inItemsAtIndex:(NSUInteger)index
{
  [_items insertObject:item atIndex:index];
}

通常它只是向集合发送一条适当的消息。