iOS - 将变量传递给视图控制器

时间:2012-06-30 09:00:58

标签: iphone ios uiviewcontroller

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

首先,我尝试为其中一个标签创建一个属性,然后从调用类中调用它。例如:

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的视图中更新按钮的文本。但是,如果我再次按下此按钮(再次显示模态视图),而另一个视图在屏幕上显示动画,则该按钮暂时再次显示其原始值(来自笔尖)。有谁知道这是为什么?

8 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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

,最后在其他视图控制器的实现中,view2:

// 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的passingVariable ivar。希望这会对你有所帮助。

答案 2 :(得分: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;
}

答案 3 :(得分:2)

首先,如果您是通过Interface Builder制作的,请检查是否已将此标签IBOutlet附加到xib中。

像这样使用....

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

在.h文件中取一个字符串变量并在此处设置该字符串.. NSSting * str in .h

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

并在 viewDidLoad: viewWillApear中设置标签:

 self.teamCountLabel.text = str;

愿这会帮到你

答案 4 :(得分:2)

正如stavash所说,xib中的控件是在视图中创建的。更确切地说,它们是用这一行创建的:

    [super viewDidLoad];

因此,mylabel在此之前不存在(它是零)。

最简单的方法是:

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

更长但更正确的路径是在SetTeamsViewController类中使用成员NSString *,在显示窗口之前将其设置为teamCount,并在视图中加载以将该membre值放入标签中。

CDT

答案 5 :(得分:1)

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

<。>在.h文件中(其中RootViewController是我的DataClass,用新类替换名称)

+(RootViewController*)sharedFirstViewController; 
<。>文件中的

//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].variable

希望它对你有所帮助:)。

答案 6 :(得分:1)

使用Storyboard,正确的方法是在performSegueWithIdentifier中将indexPath作为sender参数传递

-(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];

    }
}

答案 7 :(得分:0)

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

controller-&gt; pub_var1 = val1; controller-&gt; pub_var2 = val2;

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

如果不清楚,我可以显示代码