如何在基类中连接到 IBOutlet 或 IBAction?

26
我有一个基础的视图控制器类,它继承自UIViewController,还有一个从基类viewcontroller继承的子类。现在我有一个nib文件,其文件所有者是继承类,但是我所有的操作和输出都在基类中。是否可能将nib文件中的操作\输出连接到基类中的操作\输出?

是的。您在Xcode中的所有文件都在同一个项目中吗? - wbyoung
3个回答

33

我将通过示例来基本解释它:

在.h文件中定义一个基类(我们称之为BaseViewController),并为其分配一个UITableView的IBoutlet:

//  BaseViewController.h
@interface BaseViewController : UIViewController    
@property (weak, nonatomic) IBOutlet UITableView *tableView;    
@end

定义两个子类(例如FirstChildViewControllerSecondChildViewController):

// FirstChildViewController.h
@interface FirstChildViewController : BaseViewController
@end

// SecondChildViewController.h
@interface SecondChildViewController : BaseViewController
@end

现在,要使子类(或两个子类)使用基类的iboutlet,只需将引用outlet拖动到基类.h文件中的属性定义上即可。

enter image description here

这里有一个完整的项目来说明这一点。


8
如果基类在Swift框架中,即使基类和其outlets是公开的,有时Xcode 7也无法看到outlets。在这种情况下,解决方法如下:
  1. 在IB中将控件设置为使用基类
  2. 连接outlets
  3. 在IB中将控件设置为使用派生类
IB将在outlets旁边显示“!”,就像它们丢失了一样,但在运行时不会出现任何错误。
如果有更好的解决方法,请告诉我!

你能详细解释一下如何做这件事吗? - C0D3
@c0d3Junk13:打开Storyboard。显示Identity Inspector。选择控件。将其类设置为基类。连接输出口。选择相同的控件并将类设置为派生类。忽略警告。 - phatmann
嗯...这似乎有些粗糙,它是允许的吗?还是说它会在以后出现问题? - Just a coder
这确实有些hackish。幸运的是,Xcode 7.3似乎总能找到outlets,所以希望你永远不需要这样做。 - phatmann
七年后,这个解决方案在Xcode 14.1中仍然适用。 - hordurh

7

有两种方法可以实现这个:

1)

通过编程(即在代码中)进行

首先在基类中声明您的输出口。

然后在继承类中通过代码分配您的输出口。

2)

您还可以在XIB文件中分配您的输出口和操作。 Xcode知道来自基类的继承输出口和操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接