我正在尝试使用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
创建一个属性吗?或者我应该遵循另一个程序?
答案 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