如何将 XIB 和 return 调用到调用 XIB?

How to call a XIB and return to the calling XIB?

我有一个包含两 (2) 个 XIB 文件的应用程序;一个是主视图,另一个是帮助视图。我为两者都创建了视图控制器。我在主视图 XIB 上有一个按钮调用帮助视图,其工作方式如下:

- (IBAction)bDisplayHelp:(UIButton *)sender {

HelpViewController *svc = [HelpViewController new];
svc = [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil];

[self.view addSubview: svc.view];

}

在“帮助”视图中,我有一个按钮可以让用户返回主视图。这是我的代码(不起作用):

- (IBAction)bBackToMainNib:(UIButton *)sender {

MainViewController *tvc = [MainViewController new];
tvc = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
[self.view addSubview: tvc.view];

}

我所做的基本上就是来回走动。当我尝试 return 到主视图(不执行第一条语句,只是崩溃)时,我在运行时遇到此错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bBackToMainNib:]: unrecognized selector sent to instance 0x7d3586b0'

我做错了什么?

很抱歉,您做的几乎所有事情都是错误的。首先,您在 bDisplayHelp: 中的第一行是无用的,因为您在下一行中重新定义了 svc (您在 bBackToMainNib: 中遇到了同样的问题)。将这两行替换为,

HelpViewController *svc = [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil];

其次,您的 bBackToMainNib: 方法不会返回到主控制器,它会创建主视图控制器的一个新实例。

第三,您不应该将一个控制器的视图添加到另一个控制器的视图,除非您还将该控制器添加为子视图控制器(否则视图控制器将被释放)。您可能应该显示(然后在您想要返回时关闭)HelpViewController,而不是将其视图添加为子视图(尽管我不知道您的意图是什么,这可能不是最佳选择)。我建议您阅读 "View Controller Programming Guide for iOS" 以了解 iOS 编程的基本范例。

至于你的实际错误,这是一个谜。错误消息是说你正在调用 bBackToMainNib: 一个字符串,而不是你的控制器;我不确定那是怎么发生的。