简体   繁体   中英

Passing contents of array from one class to another

I've got an array populating a small tableView in a DetailView class, and when the user presses a button I need the array to be sent to another View Controller, to populate a tableView there, but I'm having some difficulty getting it working. This is what I've been trying to do so far:

*DetailViewController.m*

    #import "DetailViewController.h"
    #import "OtherViewController.h"


-(IBAction) toCart:(id)sender {

    OtherViewController *oVC = [[OtherViewController alloc] init];
    oVC.shoppingList = sList;
    NSLog(@"Ingredients count %d", [sList count]); //This returns a number, so the sList definitely contains values, and the method is definitely being called.
    [oVC release];

}

*OtherViewController.m*

    #import "OtherViewController.h"
    #import "DetailViewController.h"

    @synthesize shoppingList;

-(void) viewWillAppear: (BOOL)animated {
    NSLog(@"list count: %d", [shoppingList count]); // This returns 0

}

sList is populated elsewhere in the class, and sList and shoppingList are both declared in their respective .h files, with @property (nonatomic, retain)...

Any help much appreciated!

As you are having taBbarcontroller , so you can proceed as follows :

Create references of your you viewControllers (which are associated with tabbar as topViewController ) in your appDelegate .

otherViewController = [[tabBarController.viewControllers objectAtIndex:<tabIndex>] topViewController];

make it as @property in appDelegate so that you can access it anywhere in your app.

now,

-(IBAction) toCart:(id)sender {

    //appDelegate <--- get reference to your application delegate using [[UIApplication sharedApplicaiton]delegate] do not forget to properly type cast it.

    OtherViewController *oVC = [appDelegate otherViewController];
    oVC.shoppingList = sList;
    NSLog(@"Ingredients count %d", [sList count]); 
//This returns a number, so the sList definitely contains values, and the method is definitely being called.
   // [oVC release]; no need to release it...

}


//also make sure you do not initialize shoppingList of otherViewController in viewDidLoad(or any other method) of otherViewController, else it will be overwritten(lost its previous reference).

in your appDelegate's .h write

@property OtherViewController *otherViewController;

in appDelegate's.m

@synthesize otherViewController;

in appDelegates 's . m (method didFinishLaunchingWithOptions : ) write

otherViewController = [[tabBarController.viewControllers objectAtIndex:<tabIndex>] topViewController];

Thanks

In toCart: , you are creating an OtherViewController and then immediately throwing it away. Whatever OtherViewController is calling -viewWillAppear , it isn't the one you're creating in toCart: . How is that object created and put on the screen? You need a pointer to it to modify it.

Better, though, would be to move your model data out of the view controllers and put it in a single ShoppingCart object. Then all your view controllers would have a reference to it (or you can make ShoppingCart a singleton if that makes sense in your program). This way, any time you change the shopping cart from anywhere, all views will correctly update without having to tell every view controller about every other view controller.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM