如何从一个视图控制器复制文本到另一个



我正在编写一个小测验应用程序。所以我有一个第一个视图,我让一个人输入他/她的名字,一个按钮是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;

希望它能起作用!!

重写SecondViewControllerinit方法,如下所示

-(id)initWithUsername:(NSString *)username
 {
      //create instance and then do 
      text2.text = username ;
 }

FirstViewController中,使用上面的

创建SecondViewControllerinit实例
  SecondViewController *second = [[SecondViewController alloc] initWithUsername:text1.text]; 

要将值从一个VC传递到另一个VC,您必须执行以下代码:

  1. 首先在下一个视图中声明局部变量。

    @property(nonatomic, strong) NSString *personName;
    
  2. 现在在第一个VC中准备第二个VC的对象。M文件打开按钮点击动作。但在此之前,必须在storyboard中设置第二个VC的storyboard标识符。

    SecondViewController *obj = (SecondViewController *) [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    obj.personName = self.txtUserName.text;
    
  3. 现在进入第二个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应该而不是用作通用存储容器。它的目的是获取常见的共享数据,如用户名、首选项等。像用户在游戏开始时输入的名字就属于这种使用模式。

最新更新