我正在写一个小测验应用程序。所以我有第一个视图,我要求一个人输入他/她的名字和一个IBAction
按钮,用第一个问题进入下一个视图。最后,在一个人回答了所有问题之后,出现了祝贺视图,我要复制在第一个视图中输入的名称。说会有一句话“干得好,约翰!”我该怎么做?
在第一个视图(FirstViewController
)上,我制作了一个文本字段
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
我不知道还能做什么...
答案 0 :(得分:0)
您可以覆盖
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
最后一个视图控制器的方法,如:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andUserName:(NSString*)userName
(不要忘记在你的.h文件中声明这个方法。)
现在,在初始化上一个视图控制器时,您可以将用户名传递给最后一个视图控制器。
在最后一个视图控制器中执行此overriden方法时,请在某个局部变量中复制此名称。并使用它。
希望这能解决您的问题。
答案 1 :(得分:0)
在您的firstView中添加NSString
及其属性
在.h文件中有类似的东西
NSString *username;
和
@property (nonatomic , retain) NSString *username;
<。>文件中的
username = text1.text;
在LastView中 我.m文件
#import "FirstView.h"
无论你想要用户名,都试试这个
FirstView *firstview = [[FirstView alloc] init];
text2 = firstview.username;
希望它有效.. !!
答案 2 :(得分:0)
覆盖init
的{{1}}方法,如下所示
SecondViewController
在-(id)initWithUsername:(NSString *)username
{
//create instance and then do
text2.text = username ;
}
中,您使用上述
FirstViewController
SecondViewController
的实例
init
答案 3 :(得分:0)
要将值从一个VC传递到另一个VC,您必须执行以下代码:
首先在下一个视图中声明要移动的局部变量。
@property(nonatomic, strong) NSString *personName;
现在在按钮点击操作的第一个VC.m文件中准备第二个VC的对象。但在此之前必须在故事板中设置第二个VC的故事板标识符。
SecondViewController *obj = (SecondViewController *) [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
obj.personName = self.txtUserName.text;
现在继续第二个VC并做任何你想做的事。
注意:在这里,您不需要使用userdefaults,或者使用参数准备初始化方法,或者使用委托等等。
答案 4 :(得分:-1)
执行此操作的最佳方法是在各种视图上获取所需的变量,并在委托上处理它们,因为委托可以访问所有内容。建立一个全局变量永远不可能是委托的用途。
您可以参考此问题来处理同一问题:Passing data between view controllers
答案 5 :(得分:-1)
您可以在应用程序委托类中添加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
答案 6 :(得分:-2)
我会在输入时使用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
不应该用作通用存储容器。它的目的是用于共享的共享数据,如用户名,首选项等。用户在游戏开始时输入的名称似乎属于使用模式。