2011-09-21 83 views
1

我正在写一个小测验应用程序。所以我有第一种观点,我要求一个人输入他/她的名字和一个是IBAction的按钮,用第一个问题去看下一个视图。最后,在一个人回答完所有问题之后,出现恭喜观点,我想复制名称,这是在第一个视图中输入的。说会有一句话“干得好,约翰!”我该怎么做?如何将文本从一个ViewController复制到另一个?

在第一视图(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

我不知道还能做什么?

回答

-1

要做到这一点,最好的办法将采取您需要的各种变量由于委托可以访问所有内容,因此可以在委托上查看和处理它们。制定一个全局变量是不可取的,这是代表的目的。

你可以参考这个疑问,对待同一个问题:Passing data between view controllers

+0

访问应用程序的委托是一样的,在概念上,如使用全球变量。应用程序委托不应该被用来存储数据。您建议的方法尽管看起来很方便,但如果您继续滥用它,很快就会变得混乱。 – LucasTizma

+0

请你详细解释一下吗?我真的是虚拟的) – Ann

+0

您将始终拥有委托,委托是管理控制器的委托人。它与全局变量不同,它是它的一个意思功能。 [在委托中使用泛型数据对象](http://www.iphonedevsdk.com/forum/iphone-sdk-development/54859-sharing-data-between-view-controllers-other-objects.html)这是最合乎逻辑的方法。做一个单身人士是危险和记忆消耗。当然,让我失望,但如果你想公平的话,你必须对babbidi进行倒退。 – Joze

-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 
0

您可以覆盖最后一个视图控制器的

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 

法的东西,如:

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andUserName:(NSString*)userName 

(不要忘了在.h文件中声明此方法)

现在在初始化您的最后一个视图控制器时,您可以将用户的名称传递给最后一个视图控制器。

在最后一个视图控制器中执行此重写方法时,将此名称复制到某个局部变量中。并使用它。

希望这能解决您的问题。

+0

问题在于你需要传递名字给每个人中间视图控制器,所以你可以将它传递给最后一个,这在我看来是庞大的。 – LucasTizma

+0

是的,我同意。如果您需要在两个即时视图控制器之间传递值,则此解决方案适用于: –

-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应该而不是被用作通用存储容器。其目的是为了共享,共享数据,如用户名,首选项等。用户在游戏开始时输入的名称似乎属于使用模式。

+0

如果您的数据包含自定义类,则这不起作用。你必须把这些对象转换成可以进入NSUserDefaults的东西 - 就像字典 - 然后在另一端转换回来。不值得付出努力,并且会比简单地传递引用慢得多。 – Joze

+0

加上NSUserDefaults非常慢,它就像是用脚搔你的背。它没有任何意义。使用委托是优雅和简单的。 – Joze

+0

@Joze只是因为你的建议不正确不应该使我的无效。你没有理由声称'NSUserDefaults'很慢。 – LucasTizma

0

在你的firstView

NSString *username; 

@property (nonatomic , retain) NSString *username; 

在.m文件添加NSString其财产
像这样的事情在.h文件中

username = text1.text; 

在LastView
IM .m文件

#import "FirstView.h" 

而且在任何你想要的用户名试试这个

FirstView *firstview = [[FirstView alloc] init]; 
text2 = firstview.username; 

希望工程.. !!

+0

您试图从新创建的FirstView实例中获取'username',这与用户插入文本的实例不同。但是,您可以通过在视图层次结构中循环来获取'FirstView'(如果没有弹出)。 –

0

覆盖的SecondViewControllerinit方法如下

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

而在FirstViewController,在其中创建使用上述

SecondViewController *second = [[SecondViewController alloc] initWithUsername:text1.text]; 
0

所述的SecondViewControllerinit它例如用于传递值从一个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,或者用参数初始化准备方法或使用委托等

相关问题