0
votes

I've followed several guides on passing data between view controllers, but they seem to involve setting the secondViewController's property in any equivalent of a -(void)goToNextView method. I'm trying to figure out how to assign a value to a property in a 2nd view controller from the first while using a tab bar controller created in the app delegate.

Current setup:

AppDelegate.m

@synthesize window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
   ...
    UITabBarController *tbc = [[UITabBarController alloc] init];
    FirstViewController *vc1 = [[FirstViewController alloc] init];
    SecondViewController *vc2 = [[SecondViewController alloc] init];

    [tbc setViewControllers: [NSArray arrayWithObjects: vc1, vc2, nil]];

    [[self window] setRootViewController:tbc];
    [self.window makeKeyAndVisible];
    return YES;
}
...
@end

FirstViewController.h

#import "SecondViewController.h"

@interface FirstViewController : UIViewController
{
    SecondViewController *vc2;

    IBOutlet UISlider *sizeSlider;
}

@property (nonatomic, retain) SecondViewController *vc2;
@property (strong, nonatomic) UISlider *mySlider;

-(IBAction) mySliderAction:(id)sender;

@end

FirstViewController.m

#import "FirstViewController.h"
#import "SecondViewController.h"

@implementation FirstViewController

@synthesize vc2, mySlider;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {
        UITabBarItem *tbi = [self tabBarItem];
        [tbi setTitle:@"xib"]; 
    }
    return self;
}
...
- (IBAction) mySliderAction:(id)sender
{
    NSString *str = [[NSString alloc] initWithFormat:@"%3.2f", mySlider.value];
    if(self.vc2 == nil)
    {
        SecondViewController *viewTwo = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
        self.vc2 = viewTwo;
    }
    vc2.sliderValueString = str;  
}
...
@end

SecondViewController.h

#import <UIKit/UIKit.h>
#import "myView.h"

@interface SecondViewController : UIViewController
{   
    NSString *sliderValueString; 
}

@property (copy) NSString *sliderValueString;
@end

SecondViewController.m

#import "SecondViewController.h"

@implementation SecondViewController

@synthesize sliderValueString;

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        UITabBarItem *tbi = [self tabBarItem];
        [tbi setTitle:@"View 2"];
    }
    return self;
}

-(void) loadView
{
    CGRect frame = [[UIScreen mainScreen] bounds];
    myView *view = [[myView alloc] initWithFrame:frame];

    printf("Slider Value: %s", [sliderValueString UTF8String]);

    [self setView: view];
}
...
@end

myView.h and .m are likely irrelevant to the question, but I've got the .h subclassing UIView, and the .m creating the view with -(id)initWithFrame:(CGRect)frame

I'm guessing that I'm assigning the 2nd VC's property in the wrong place (mySliderAction), given that the printf() in the 2nd VC is blank, so my question is: Where should the property be assigned, or what am I doing wrong that is preventing the 2nd VC from allowing it's sliderValueString to not be (or remain) assigned?

Thanks!

1

1 Answers

0
votes

You are fine setting the property in mySliderAction, the trouble is that you are setting it on the wrong object.

In the App Delegate you create a viewController for tabControllers' item 2:

SecondViewController *vc2 = [[SecondViewController alloc] init];

In vc1's mySliderAction you also create an instance of vc2:

SecondViewController *viewTwo = [[SecondViewController alloc] initWithNibName:nil bundle:nil];

This is not the instance that you navigate to via the second tab on the tabController, but it is the one who's sliderValueString property you are setting.

Instead of making a new instance here, you need to refer to the already-existing instance:

 SecondViewController *viewTwo = [self.tabBarController.viewControllers objectAtIndex:1]

Then you should be ok.