Adding object to NSMutableArray in another xib

Im trying to add an object to a NSMutableArray in another xib. But seems isnt working. What im doing wrong?

Thanks!

-(void) buy {
    CartViewController *carrinho = [[CartViewController alloc] initWithNibName:@"CartViewController" bundle:[NSBundle mainBundle]];
    carrinho.produtoCodigo = [[NSMutableArray alloc]init];
    [carrinho.produtoCodigo addObject:@"aa"];
    [carrinho release];
    NSLog(@"did");
}

Answers


Your code looks fine so far. Make sure the connections in InterfaceBuilder and the File's owner in the XIB is set correctly.


Ok, several things. First you don't need to pass in [NSBundle mainBundle]. nil works fine if you want the main bundle. Second issue is, produtoCodigo should be a property set to retain and as such you should pass in an autoreleased NSMutableArray i.e. [NSMutableArray array].

Thirdly, I would question why you would want to do this. It seems like a bad design. Ideally the mutable array should be an internal ivar in CartViewController. You should then have a method on CartViewController to handle the item. You should not care about how it is stored internally, only that you want to add an object to the controller.

If you want to pass in multiple objects you should have a method that takes an array of objects and pass that in.

Now finally, nibs don't really hold arrays, the class does. As such it shouldn't be an issue with your nib. The issue should therefore be with the class. Where are you checking whether the array is being updated and finding that it isn't?


you declare and create carrinho as a view controller, which should allocate and init the carrinho.produtoCodigo as well, if you have it synthesized. Then you alloc it again, which may be a memory leak. After adding the aa, you release it. Therefore, overall, you haven't accomplished anything. That mutable array comes into being, is modified, and then destroyed.

You mention "another xib" and from the name CartController and method name "buy" it sounds like you want to update a shopping cart that is being held by some other class. Therefore, the view or class with the cart (and mutable array) needs to be modified. It's like if you and a friend go shopping, and you delegate the job of managing the cart to him. He is the delegate, and only he can put stuff in the cart. Just because you want to buy something, you have to give it to him first so that he can put it in the cart. Right now, your code is like you grab something off the rack, but then put it back on the rack. It never makes it into the cart.

What you want to do is create a shopping protocol with a message addToCart which is what this code would instead do. It would send the message to the delegate to add the item to the cart. The other xib code has a method -(void)addToCart:(id)item; which is what is invoked when this code chunk does to call to the delegate. Look up protocols and delegates; they are simple to create, and the only way to get multiple controllers talking to one another.


Maybe you inserted this below code in the second XIB:

-(void) viewDidLoad {
    produtoCodigo = [[NSMutableArray alloc] init];
}

because if you make allocate an array again, the previous objects in it will be removed.


Need Your Help

How do I know if a view is visible or not?

objective-c ios xcode cocoa-touch animation

Say I have two view controllers: xVC and yVC. I have used the shake API and and have used the methods -(void)motionBegan,-(void)motionEnded: and -(void)motionCancelled in xVC. What happens is when ...

Using Caliburn.Micro binding feature on an "inner" user control

c# .net user-controls caliburn.micro

I'm quite new to Caliburn.Micro, so I guess this has a simple answer (or at least I hope it has :))