如何将文本从一个ViewController复制到另一个?

时间:2011-09-21 13:30:36

标签: iphone ios

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

我不知道还能做什么...

7 个答案:

答案 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,您必须执行以下代码:

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

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

    SecondViewController *obj = (SecondViewController *) [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    obj.personName = self.txtUserName.text;
    
  3. 现在继续第二个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 应该用作通用存储容器。它的目的是用于共享的共享数据,如用户名,首选项等。用户在游戏开始时输入的名称似乎属于使用模式。