2013-04-14 82 views
0

我已经遵循了几个指导视图控制器之间传递数据,但他们似乎涉及设置secondViewController的属性在任何等效的 - (无效) goToNextView方法。我试图找出如何使用在应用程序委托中创建的选项卡栏控制器从第一个值向第二个视图控制器中的属性赋值。UISlider数据从XIB的视图控制器传递到非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)框架

我猜我分配第二个VC的属性在错误的地方(mySliderAction),因为第二个VC中的printf()是空白的,所以我的问题是:该属性应该分配在哪里,或者我在做什么错误,阻止第二个VC允许它的sliderValueSt戒指不被(或保持)分配?

谢谢!

回答

0

你很好设置mySliderAction中的属性,麻烦的是你将它设置在错误的对象上。

在App代表创建的viewController为tabControllers'项目2:

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

相关问题