2013-04-14 5 views
0

Я следил за несколькими руководствами по передаче данных между контроллерами представлений, но они, похоже, связаны с установкой свойства secondViewController в любом эквиваленте a - (void) goToNextView. Я пытаюсь понять, как назначить значение свойства во втором контроллере представления с первого раза, используя контроллер панели вкладок, созданный в делете приложения.Передача данных UISlider от контроллера представления XIB к контроллеру View, отличного от XIB, с UITabBarController

Текущая установка:

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 и .m, скорее всего, не имеет отношения к вопросу, но у меня есть .h подклассов UIView и .m создания представления с - (id) initWithFrame: (CGRect) frame

Я предполагаю, что я назначаю свойство второго VC в неправильном месте (mySliderAction), учитывая, что printf() во втором VC пуст, поэтому мой вопрос : где должно быть назначено свойство, или что я делаю неправильно, что препятствует тому, чтобы второй VC разрешал ему sliderValueSt чтобы не было (или оставлено) назначено?

Спасибо!

ответ

0

Вы прекрасно отредактировали объект в mySliderAction, проблема в том, что вы устанавливаете его на неправильный объект.

В App делегатом вы создаете ViewController по пункту 2 tabControllers':

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

В vc1-х mySliderAction вы также создать экземпляр VC2:

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

Это не пример что вы переходите через вторую вкладку tabController, но это тот, у кого есть sliderValueString свойство, которое вы устанавливаете.

Вместо того, чтобы новый экземпляр здесь, вам необходимо обратиться к уже существующему экземпляру:

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

Тогда вы должны быть в порядке.

+0

Спасибо! Решила проблему! – user2280110

Смежные вопросы