使用XIB的视图作为子视图并访问其textfield属性

时间:2012-08-29 19:53:47

标签: iphone objective-c xcode

我正在尝试使用NameSubView中的NameSubViewController作为MainViewController中的子视图。我做了那个工作,但我也想访问子视图的UITextField,如下所示:

MainViewController.m

#import "NameSubViewController.h"

...

UIViewController *nameController = [[NameSubViewController alloc] initWithNibName:@"NameSubViewController" bundle:nil];
nameSubView = [nameController view];
[self.view addSubview:nameSubView];

NSString *textFieldString = nameSubView.textField.text;

但是我无法让它发挥作用。这就是我创建子视图时所做的:

  • 使用XIB作为接口

  • 制作NameSubViewController
  • 为IB视图创建NameSubView类,将视图设置为此类Identity Inspector

  • @property (nonatomic, strong) IBOutlet UITextField *textField;中创建NameSubView并连接到IB中的文本字段。


然后我可以加载子视图,但我无法从MainViewController访问textField。因此,要访问它,我在Identity Inspector中将文件所有者的类NameSubViewController更改为NameSubView

现在访问NameSubViewController,但找不到视图的属性,因此应用程序崩溃。我不知道我是否遵循了正确的程序,现在可以为NameSubView中的NameSubViewController创建一个属性吗?或者我应该遵循另一个程序?

2 个答案:

答案 0 :(得分:1)

  • NameSubViewController返回给身份检查器中的文件所有者。
  • NameSubView添加到身份检查器中的视图。

然后使用此代码:

#import "NameSubViewController.h"
// If view's declaration is located in a separate file then the next line is important
#import "NameSubView.h" 

...

// It is better to declare the view controller as 'NameSubViewController'
NameSubViewController *nameController = [[NameSubViewController alloc] initWithNibName:@"NameSubViewController" bundle:nil];
// A casting to 'NameSubView' should do the main magic
NameSubView *nameSubView = (NameSubView *)[nameController view];
[self.view addSubview:nameSubView];

// It is better to ensure that the view is of a correct class 
// before using its specific properties
if ([nameSubView isKindOfClass:[NameSubView class]]) {
  // Now it should work 
  // (assuming that you have a property 'textField' in 'NameSubView')
  NSString *textFieldString = nameSubView.textField.text;
}

答案 1 :(得分:1)

首先,将文件所有者更改回NameSubViewController。将文本字段IBOutlet声明移动到NameSubViewController,并确保在nib中正确连接所有内容。最后,声明您的nameController变量为NameSubViewController类型,而不是UIViewController。然后,您应该能够使用nameController.textField

获取文本字段