Hal
Hal

Reputation:

How do I pass variables between view controllers?

i'm having a hard time with Xcode; for some reason, it just won't let me pass a variable from one view controller class to another. It should work, i was basically just copying/pasting from my other classes (it works on all of them... except this one). I've been at it all night long, tried everything i could think of and still it remains.

Here's the view controller class where I'm making the call:

ResultadosViewController.h:

#import <UIKit/UIKit.h>
#import "Filme.h"
#import "Festival.h"
#import "Top10Discos.h"
#import "Peca.h"

@class DetalhesViewController;

@interface ResultadosViewController : UIViewController
{
    // Navegation
    DetalhesViewController *dvc;
    BOOL isViewPushed;

    // What i'd really like to pass lol
    NSArray *array_resultados;

}

@property (nonatomic, retain) NSArray *array_resultados;
@property (nonatomic, readwrite) BOOL isViewPushed;

@end*

ResultadosViewController.m:

#import "ResultadosViewController.h"
#import "DetalhesViewController.h"
#import "Filme.h"
#import "Peca.h"
#import "Top10Discos.h"
#import "Festival.h"

@implementation ResultadosViewController
@synthesize isViewPushed, array_resultados;

(...)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic -- create and push a new view controller

    if (indexPath.row == 2)
    {
        if(dvc != nil)
            [dvc dealloc];

        NSString *ffs = [[array_resultados objectAtIndex:indexPath.row] TituloFilme];

        dvc = [[DetalhesViewController alloc] initWithNibName:@"DetailedView" bundle:[NSBundle mainBundle]];

        **resultadosControllerCell.array_resultados  = [self array_resultados];** 
        *"Request for member 'array_resultados' in something not a structure or union"*

        //Push the view controller to the top of the stack.
        [self.navigationController pushViewController:dvc animated:YES];

    }
}

And here's the other class i want to send the array into:

DetalhesViewController.h:

#import <UIKit/UIKit.h>

#import "Filme.h"
#import "Festival.h"
#import "Top10Discos.h"
#import "Peca.h"


@interface DetalhesViewController : UIViewController
{
    // Navegacao
    NSArray *array_resultados;

}

@property (nonatomic, retain) NSArray *array_resultados;
@end

I'm not sure if any of you would to see the .m file for this class; in that case, just ask.

Thanks in advance, Hal

PS: tried with other variables (other types too), cleansed/rebuilt, recreated xib file, you name it... i'm outta tricks :(

Upvotes: 4

Views: 21250

Answers (6)

Monica Chaturvedi
Monica Chaturvedi

Reputation: 21

Follow these simple steps please, it should work.

In your SecondViewController:

  1. Create an initializer in the second View Controller. Ex:

    -(id)initWithResultsArray: (NSArray *) resultsArray;

  2. Create a variable for holding the array. Say myResultsArray.

  3. Inside the initWithResultsArray method, save the value of resultsArray to myResultsArray.

  4. Initialize the SecondViewController using initWithResultsArray instead of just init.

  5. Present your controller as usual, you will be able to work with myResultsArray.

Hope this helps.

Monica ツ

Upvotes: 0

RyanL
RyanL

Reputation: 108

A more competent way of doing this is to separate the data from both the viewcontrollers into a model. You will have a separate class(NSObject) called ResultadoModel.h/m. This will be a singleton, so both classes can access the same instance.

You would access the array by doing something like this(in both vcs):

[[[ResultadoModel sharedInstance] array_resultados] propertyOrMethod];

You can search how to create a singleton, it's very simple and very powerful.

Upvotes: 0

Peter Hosey
Peter Hosey

Reputation: 96333

First off, don't use -> — that's direct instance-variable access. It may work, but you're changing another object's instance variables without its knowledge, which is just asking for trouble.

And no, Adam Rosenfield didn't mean dvc->array_resultados; he meant resultadosControllerCell->array_resultados, which is what he said and which he based on what you said.

The correct solution is a blend of your original line and your revision of Adam's line:

dvc.array_resultados = [self array_resultados];

This goes through the property you declared in the DetalhesViewController class.

Speaking of which, you should declare that property as copy, not retain. Otherwise, you'll find yourself holding somebody else's mutable array, which they will then modify—more bad mojo.

Upvotes: 4

Hal
Hal

Reputation:

Ok i've had it; using a cheap trick to show the info:

UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:ffs message:@"this gets covered" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
    UILabel *myTextField = [[UILabel alloc] init];
    myTextField.text = @"FFS!";
    CGAffineTransform myTransform = CGAffineTransformMakeTranslation(0.0, 130.0);
    [myAlertView setTransform:myTransform];

    [myTextField setBackgroundColor:[UIColor whiteColor]];
    [myAlertView addSubview:myTextField];
    [myAlertView show];
    [myAlertView release];

Really hate using this, but i'm already a day late. I should have delivered it by yesterday.

Thanks for your help guys, if you happen to find the solution please let me know. You never know if it'll happen again :/

Cheers!

Upvotes: 0

Matt Ball
Matt Ball

Reputation: 6618

This doesn't exaclty answer your question, but your memory management is a bit wonky. This line:

[dvc dealloc];

should read like this:

[dvc release];
dvc = nil;

In Cocoa, you should never call dealloc directly -- follow the retain/release/autorelease pattern and things will work better and as intended.

Upvotes: 3

Adam Rosenfield
Adam Rosenfield

Reputation: 400274

Just a guess, but did you try using the arrow operator -> instead of the dot operator . ?

resultadosControllerCell->array_resultados  = [self array_resultados];

Upvotes: 0

Related Questions