2012-06-30 121 views
2

我有一个视图控制器,当我在屏幕上显示这个视图时,我希望能够从调用类传递变量给它,以便我可以设置标签等iOS - 将变量传递给视图控制器

首先,我只是尝试创建一个标签的属性,并从调用类调用。例如:

SetTeamsViewController *vc = [[SetTeamsViewController alloc] init]; 
vc.myLabel.text = self.teamCount; 
[self presentModalViewController:vc animated:YES]; 
[vc release]; 

但是,这并没有奏效。所以我试着创建一个方便的初始化器。

SetTeamsViewController *vc = [[SetTeamsViewController alloc] initWithTeamCount:self.teamCount]; 

然后在SetTeamsViewController

- (id)initWithTeamCount:(int)teamCount { 
    self = [super initWithNibName:nil bundle:nil]; 
    if (self) { 
     // Custom initialization 
     self.teamCountLabel.text = [NSString stringWithFormat:@"%d",teamCount]; 
    } 
    return self; 
} 

不过,这也不能工作。它只是加载我在nib文件中给出标签的任何值。我用NSLog() s散布了代码,它正在传递正确的变量值,它只是不设置标签。

任何帮助将不胜感激。

编辑:我刚刚尝试在我指定的初始化程序中设置一个实例变量,然后在viewDidLoad中设置标签,并且工作!这是做这件事的最好方法吗?

此外,当关闭此模式视图控制器时,我也更新了调用ViewController视图中按钮的文本。但是,如果我再次按下此按钮(再次显示模式视图),而另一个视图在屏幕上呈现动画效果,则该按钮会暂时将其原始值(来自笔尖)。有人知道为什么吗?

+0

这些标签是否被声明为IBOutlets并且在IB中与它们各自的视图连接? – Stavash

+0

@stavash是的,他们是。 –

回答

6

当初始化视图控制器时,在initWithNibName方法内,驻留在视图控制器中的视图尚未初始化,您现在还不能设置它们的属性。根据“viewDidLoad”方法做任何你需要的视图。

1

这取决于你的需要。您可以使用Singleton类来在不同类之间共享您的变量。定义你想在你的DataClass中共享的所有变量。

在.h文件中(其中RootViewController的是我的数据类,与新类替代名称).m文件

//make the class singleton:-  
+(RootViewController*)sharedFirstViewController  
{  
    @synchronized([RootViewController class]) 
    { 
     if (!_sharedFirstViewController) 
      [[self alloc] init]; 

     return _sharedFirstViewController; 
    } 

    return nil; 
} 


+(id)alloc 
{ 
    @synchronized([RootViewController class]) 
    { 
     NSAssert(_sharedFirstViewController == nil, 
       @"Attempted to allocate a second instance of a singleton."); 
     _sharedFirstViewController = [super alloc]; 
     return _sharedFirstViewController; 
    } 
    return nil; 
} 

-(id)init { 
    self = [super init]; 
    if (self != nil) { 
     // initialize stuff here 
    } 
    return self; 
} 

+(RootViewController*)sharedFirstViewController; 

后,您可以使用您的变量

任何其他类这样的

[RootViewController sharedFirstViewController].variable 

希望我吨的帮助:)

+0

不错!我想知道如何做到这一点,这将对我有很大的帮助。谢谢! –

+0

欢迎您:) – QueueOverFlow

6

我不是专业人士,但这可能会帮助你。

在标题view1.h,声明所期望的性质:

// view1.h 

@interface view1 : UIViewController { 
    NSString *passingVariable; 
} 

@property (nonatomic, strong) NSString *passingVariable; 

@end 

然后在view1实施,合成可变:

// view1.m 

@implementation view1 

@synthesize passingVariable; 

// the rest of the implementation 

@end 

,最后在其他视图的执行控制器,视图2:

// view2.m 

#import "view1.h" 

@implementation view2 

-(IBAction)changeview 
{ 
    view1 *myview = [[view1 alloc] init]; 

    myview.passingVariable = @"Hello Variable"; 

    [self.navigationController pushViewController:myview animated:YES]; 
} 

@end 

这里我试图从view2转到查看1,并且初始化view1的passVariable伊娃。希望这会帮助你。

+0

非常感谢,它的工作原理! – Reza

2

首先,你检查你有这个附加标签IBOutlet中的厦门国际银行或不是,如果你通过界面生成器使它....

使用这样的....

SetTeamsViewController *vc = [[SetTeamsViewController alloc] initWithTeamCount:teamCount]; 

乘坐在.h文件中的字符串变量,并在这里设置该字符串。在.H

- (id)initWithTeamCount:(int)teamCount { 
    self = [super init]; 
    if (self) { 
     // Custom initialization 
     str = [NSString stringWithFormat:@"%d",teamCount]; 
    } 
    return self; 
} 

,并设置您的标签在viewDidLoad中NSSting * STR:viewWillApear:

self.teamCountLabel.text = str; 

也许这将帮助你

2

正如stavash说,在厦门国际银行控制在视图中创建做负载。更精确地说,他们正在与该行创建:

[super viewDidLoad]; 

所以,mylabel没有那个时候(它是零)之前就已存在。

最简单的方法是做到这一点:

SetTeamsViewController *vc = [[SetTeamsViewController alloc] init]; 
    [self presentModalViewController:vc animated:YES]; 
    vc.myLabel.text = self.teamCount; 
    [vc release]; 

的时间越长,但更正确的路径是在SetTeamsViewController类成员的NSString *,显示窗口之前将其设置为teamCount,并在视图确实负载把这个元素的价值在你的标签。

CDT

3

在这里,我传递的ViewController的标签文本SecondViewController的标签文本

ViewController.h

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 
{ 
    // please make your control on XIB set these IBOutlet's 
    //I'm not showing how to connect these with XIB 

    IBOutlet UILabel *lblView; 
    IBOutlet UIButton *buttonGo; 
} 
//this is method which will push the view 
-(IBAction)buttonGoClickAction:(id)sender; 

ViewController.m

-(IBAction)buttonGoClickAction:(id)sender 
{ 
    SecondViewController *secondViewObject = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil]; 
    //before pushing give the text 
    secondViewObject.string = lblView.text; 
    [self.navigationController pushViewController:secondViewObject animated:YES]; 
} 

SecondViewController。^ h

#import <UIKit/UIKit.h> 

@interface SecondViewController : UIViewController 
{ 
    IBOutlet UILabel *labelView; 
    NSString *string; 
} 
//set the string property 
@property(nonatomic, retain) NSString *string; 

@end 

SecondViewController.m

#import "SecondViewController.h" 

@implementation SecondViewController 
//synthesize string here 
@synthesize string; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    //Here you will get the string 
    labelView.text = string; 
} 
+0

您好先生,如果打印下一课的字符串,我会得到空,我不知道为什么? –

+0

@sandeeptomar嗨Sandeep!你好吗?请显示你的代码。 – TheTiger

+0

是的,谢谢你的回应我忘了综合字符串,现在它的工作很好先生 –

0

,每当我需要另一个类,以便从以前的I类要么设置将存储值的全局类变量,我做了什么incase我需要他们在更多的位置或在可以设置@public变量的界面。这些变量可以使用您为下一个视图创建的控制器来设置。

controller-> pub_var1 = val1; controller-> pub_var2 = val2;

在将视图传递给根控制器之前或在您调用下一个视图之前完成此操作。您将需要#import“class.h”,以便您可以访问这些公共变量。

我可以证明代码,如果这是不明确

1

故事板的正确方式是通过indexPath发件人的说法在performSegueWithIdentifier

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    [self performSegueWithIdentifier:@"segueIdentifier" sender:indexPath]; 

} 

,并设置在目标控制器的属性:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString: @"segueIdentifier"]) { 

     NSIndexPath *indexPath = sender; 

     DetailViewController *dest = [segue destinationViewController]; 

     dest.usersArray = [self.usersArray objectAtIndex:indexPath.row]; 

    } 
} 
相关问题