2

I have a UIButton in a View Controller that is NOT the root view controller in my app. I cannot drag and create an outlet or an action for it in my header file. I can only do it from the root view controller.

Is there a simple reason for this?

4

5 回答 5

5

使用故事板时,XCode 只为第一个视图控制器(名为 ViewController.h 和 ViewController.m)创建 .h 和 .m 文件。

对于您通过 Interface Builder 添加的每个额外的视图控制器,您应该手动添加额外的自定义类文件以自定义视图控制器。

通过 Interface Builder 将视图控制器添加到故事板后,请按照以下说明进行操作:

  1. 从 XCode 主菜单中,选择 File、New、File,然后选择 Objective-C 类并单击 Next。为自定义类命名,并为您添加的视图控制器选择正确的类型(即选择UITableViewController表视图控制器)。
  2. 在 XCode 的 Interface Builder 中,选择新的视图控制器,然后从 Identity Inspector 选项卡中,将类设置为您刚刚创建的新类。

然后,您应该能够按住 CTRL 并单击将任何UIButtons或其他 UI 元素拖到新的 .h 或 .m 文件上,并在那里为视图实现任何自定义行为。

如果你不创建文件来实现你的自定义类,你就会被默认的 UI 类困住,UIViewController除非你用自定义类扩展它们,否则它们只有它们的默认行为。

您通常需要每个视图控制器一个 .m 和 .h 文件。

于 2013-05-14T17:02:07.787 回答
0

您是否要拖入该 viewController 的头文件?我猜你使用的是故事板而不是 xibs?我认为我们需要更多细节。可以截图吗?

听起来你的助手看错了。您可以在助手视图的左上角下拉菜单中将其更改为该视图控制器的匹配头文件。但就像我说的,我们需要更多细节。

于 2013-05-14T16:05:01.117 回答
0

您可以将 UIButton 连接到定义为视图控制器一部分的插座。

如果您还将该插座设为属性,那么您可以公开该按钮并使其他视图控制器可以使用该按钮来设置/获取/查询/等。后一种情况仅在按钮托管视图控制器存在于内存中时才有效(至少在最初,假设按钮可见的视图控制器不会在第一个控制器可见的同时出现) .

于 2013-05-14T16:05:53.983 回答
0

是的,有一个简单的原因,尽管在您的情况下很难确切地说出这个简单的原因是什么,因为您没有提供足够的信息。基本上,这一切都归结为视图控制器的工作方式以及它们如何从情节提要中加载/实例化。简短版本:

  • 您只能在同一“场景”内的对象之间进行出口/动作。

  • 出口/动作很复杂:如果代码中有相应的 IBOutlet / IBAction,您只能创建一个。Xcode 可以帮助创建它作为出口/动作创建过程的一部分,但这只是掩盖了这样一个事实,即代码中的 IBOutlet/IBAction 和 nib/storyboard 中的出口/动作。

通过阅读我书中关于笔尖如何真正工作的章节,您可能会得到进一步的帮助:

http://www.aeth.com/iOSBook/ch07.html#_nib_loading_and_file_8217_s_owner

这同样适用于故事板,它实际上只是将多个 nib 组合到一个文件中的一种方式。不过,故事板增加了一些复杂性,因为您可以在对象之间拖动一种东西,即关系转场(可能是您不小心创建了其中一个):

http://www.aeth.com/iOSBook/ch19.html#_storyboards

于 2013-05-14T16:06:18.137 回答
0

确保将 NIB 的文件所有者设置为正确的类。从Interface Builder中选择File's Owner并确保在Identity Inspector选项卡中设置了正确的类:

在此处输入图像描述

于 2013-05-14T16:08:23.053 回答