2

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

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

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

4

8 回答 8

6

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

于 2012-06-30T09:11:42.623 回答
6

我不是专业人士,但这可能会对您有所帮助。

在 headerview1.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. 希望这会帮助你。

于 2012-06-30T10:18:00.157 回答
3

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

视图控制器.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;

视图控制器.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

第二视图控制器.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;
}
于 2012-06-30T14:02:03.647 回答
2

首先,如果您是通过 Interface Builder 制作的,请检查是否在 xib 中附加了此标签 IBOutlet....

像这样使用它......

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;

愿这对你有帮助

于 2012-06-30T11:19:42.117 回答
2

正如 stavash 所说,xib 中的控件是在加载视图中创建的。更准确地说,它们是使用该行创建的:

    [super viewDidLoad];

所以,mylabel 在那个时间之前不存在(它是 nil)。

最简单的方法是这样做:

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

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

于 2012-06-30T11:28:26.407 回答
1

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

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

+(RootViewController*)sharedFirstViewController; 

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

希望对你有帮助:)

于 2012-06-30T09:21:31.127 回答
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];

    }
}
于 2012-10-19T01:15:57.947 回答
0

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

控制器->pub_var1 = val1;控制器->pub_var2 = val2;

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

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

于 2012-08-01T18:49:55.547 回答