我有一个视图控制器的视图,当我在屏幕上显示这个视图时,我希望能够从调用类传递变量,以便我可以设置标签的值等。
首先,我尝试为其中一个标签创建一个属性,然后从调用类中调用它。例如:
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 :(得分: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”,以便您可以访问这些公共变量。
如果不清楚,我可以显示代码