从另一个类访问文本字段的值

时间:2011-11-12 08:21:20

标签: ios ios5

我正在使用实用程序应用程序模板制作应用程序。我试图从FlipSideVewController类访问UITextField的值。

在MainViewController.h文件中,我有 -

@interface MainViewController : UIViewController <UISplitViewControllerDelegate>{

UITextField *textField;
NSString *myText;
}

@property (retain, nonatomic) IBOutlet UITextField *textField;
@property (nonatomic, retain) NSString *myText;
-(IBAction)pressButton:(id)sender;

在MainViewController.m文件中 -

myText = [[NSString alloc] initWithFormat: textField.text];
NSLog(@"%@",myText);

我使用以下代码在MainViewController类中创建FlipSideViewController -

FlipsideViewController *controller = [[[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil] autorelease];
controller.delegate = self;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];

这会在控制台中打印文本字段的值而不会出现任何问题。当我尝试访问FlipSideVewController类中的文本字段的值时(在用户按下go按钮之后),就会出现问题。

在FlipViewController类中我有 -

MainViewController *obj = [[MainViewController alloc] init ];
NSString *abc = obj.textField.text;  
NSLog(@"%@",abc);

FlipSideVewController nib文件正常加载,没有任何问题。但是,在FlipSideVewController中,控制台输出为(null)

我将不胜感激。

由于

2 个答案:

答案 0 :(得分:2)

如果您使用Utility Xcode模板,您应该将MainViewControllerFlipSideVewController视为给定:框架将为您实例化它们并使其可用于您定义的程序的其余部分(无论是在您的代码中还是在IB中。我的意思是你的行:

MainViewController *obj = [[MainViewController alloc] init ];

并没有真正做你想做的事。

在您的情况下,您似乎想要的是访问由现有MainViewController实例控制的文本字段(正确地为您提供NSLog输出的实例)来自其他现有{{1}实例。这是两个控制器以某种方式“连接”的问题。

有几种方法可以实现这一目标。一个是为您的应用定义“模型”,并在控制器之间共享。另请参见Model-View-Controller模式。模型只是一个包含“数据”的数据结构;您可以为两个控制器提供该数据结构。创建此类数据结构并将其共享的最简单方法是通过单例(我不建议将其用作最佳方式,只是注意它是最简单的方式,IMO)。 p>

另一种不那么干净的方法是将对FlipSideVewController的引用传递给MainViewController,然后通过它访问文本字段。例如,您可以在FlipSideVewController中定义一个ivar,然后,在创建两个控制器的地方,您将对ivar进行分配。

答案 1 :(得分:1)

您应该转到MainViewController并首先将textField声明为属性并合成它,以便您可以使用obj.textField访问它。如果您刚刚使用alloc和init创建了obj,那么textField实例变量中就不会有任何文本。

MainViewController.h

@property (retain) UITextField *textField;

MainViewController.m

@synthesize textField;

你可以使用

myText=textField.text;

现在应该这样做,您可以通过其他类中的obj.textField访问此textField。但是如果你在其他类中初始化它,你仍然不会得到它的价值,因为你将创建一个全新的obj,其textField.text将为空(除非你已经覆盖了它的指定初始化器来设置textField.text值)。 / p>

将NSString * abc声明为实例变量

NSString *abc;

然后作为属性

@property (copy) NSString *abc;
@synthesize abc;

创建FlipSideViewController后,

controller.abc=myText;

删除您创建obj的代码。 这样就可以了。