我正在编写一个小测验应用程序。所以我有一个第一个视图,我让一个人输入他/她的名字,一个按钮是IBAction
,带着第一个问题进入下一个视图。最后,当一个人回答完所有问题后,就会出现祝贺视图,我想在这里复制在第一个视图中输入的姓名。比如会有一句"干得好,约翰!"我该怎么做呢?
在第一个视图(FirstViewController
)上,我创建了一个textfield
IBOutlet UITextField *text1;
在。h中的最后一个视图:
IBOutlet UITextField *text2;
和
-(IBAction)copy:(id)sender;
和。m:
- (IBAction)copy:(id)sender
{
[text2 setText:[text1 text]];
}
和
#import "FirstViewController.h"
但是上面写着identifier text1 is undefined
我不知道该怎么办
你可以重写
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
最后一个视图控制器的方法,比如:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andUserName:(NSString*)userName
(不要忘记在你的。h文件中声明这个方法)
现在当初始化你的最后一个视图控制器时,你可以将用户名传递给最后一个视图控制器。
在最后一个视图控制器中实现这个被覆盖的方法时,在一些局部变量中复制这个名字。并使用它。
在你的firstView中添加NSString
和它的属性
类似于。h文件
NSString *username;
和
@property (nonatomic , retain) NSString *username;
in .m file
username = text1.text;
在LastView
m . file
#import "FirstView.h"
当你想要用户名的时候,试试这个
FirstView *firstview = [[FirstView alloc] init];
text2 = firstview.username;
希望它能起作用!!
重写SecondViewController
的init
方法,如下所示
-(id)initWithUsername:(NSString *)username
{
//create instance and then do
text2.text = username ;
}
在FirstViewController
中,使用上面的
SecondViewController
的init
实例 SecondViewController *second = [[SecondViewController alloc] initWithUsername:text1.text];
要将值从一个VC传递到另一个VC,您必须执行以下代码:
-
首先在下一个视图中声明局部变量。
@property(nonatomic, strong) NSString *personName;
-
现在在第一个VC中准备第二个VC的对象。M文件打开按钮点击动作。但在此之前,必须在storyboard中设置第二个VC的storyboard标识符。
SecondViewController *obj = (SecondViewController *) [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; obj.personName = self.txtUserName.text;
-
现在进入第二个VC,做任何你想做的。
注意:这里你不需要使用用户默认值,或准备初始化方法与参数,或使用委托等
最好的方法是在不同的视图上获取你需要的变量,并在委托上处理它们,因为委托可以访问所有东西。创建全局变量是不可取的,因为这是委托的作用。
你可以参考这个问题,处理相同的问题:在视图控制器之间传递数据
您可以在应用程序委托类中添加NSString
成员(以及属性)。
/// AppDelegate.h, or whatever it's called in your application
@interface AppDelegate : NSObject <UIApplicationDelegate> {
NSString *username;
// <rest of the members>
}
...
@property (nonatomic, retain) NSString *username;
@end
/// AppDelegate.m
@implementation AppDelegate
@synthesize username;
@end
/// FirstViewController.m
-(void)viewDidDissappear:(BOOL)animated{
[super viewDidDissappear:animated];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.username = text1.text;
}
/// LastViewController.m (or whatever it's called)
-(void)viewDidLoad{
[super viewDidLoad];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[text2 setText:[NSString stringWithFormat:@"Well done %@", appDelegate.username]];
}
好了,为了让每个人都高兴,你可以(也建议)创建自己的单例类,在其中可以保存非持久性全局变量,并在上面的代码中使用,而不是应用程序委托。
/// SharedData.h
@interface SharedData: NSObject {
NSString *username; /// or instead you can have a NSMutableDictionary to hold all shared variables at different keys
}
+(SharedData *)sharedInstance;
@property(nonatomic, retain) NSString *username;
@end
/// SharedData.m
#include "SharedData.h"
static SharedData *_sharedInstance=nil;
@implementation SharedData
@synthesize username;
+(SharedData)sharedInstance{
if(!_sharedInstance){
_sharedInstance = [[SharedData alloc] init];
}
return _sharedInstance;
}
@end
我将使用NSUserDefaults
在用户输入时设置用户名。然后,在最后一个视图控制器中,只需再次查询NSUserDefaults
以获得所需的名称。当然,这仍然是全局状态,但是NSUserDefaults
是用于这种目的的:
// In the first view controller
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@"John Doe" forKey:@"XXUserNameKey"]; // This should actually be an extern for your app to use globally
// In the last view controller
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *userName = [userDefaults stringForKey:@"XXUserNameKey"];
在应用委托中添加状态是对设计模式的滥用。
此外,我应该澄清NSUserDefaults
应该而不是用作通用存储容器。它的目的是获取常见的共享数据,如用户名、首选项等。像用户在游戏开始时输入的名字就属于这种使用模式。