【问题标题】:Cannot connect IBOutlet of UIView declared in protocol to a xib entity无法将协议中声明的 UIView 的 IBOutlet 连接到 xib 实体
【发布时间】:2014-12-28 14:55:27
【问题描述】:

我在协议中声明了这个 IBOutlet:

@protocol SomeProtocol <NSObject>

@property (nonatomic, strong) IBOutlet UIView* view;


@end

那么就有一个继承自这个协议的类:

//.h
@interface SomeClass : NSObject <SomeProtocol>
@end

//.m
@implementation TSNFactoryViews
@synthesize view = _view;
@ned

在一个 xib 文件中,我将 SomeClass 设置为类所有者,以便我可以看到 view 出口并将其连接到适当的 xib 实例。

在 XCode 4 中,我对这个概念没有任何意见。但是从 XCode 5 开始,视图有时会消失,在 XCode 6 中它最近消失了,但奇怪的是它在所有 xib 文件中都消失了,但应用程序可以毫无问题地编译和运行。

我唯一的问题是新的 xib 文件,因为我无法设置关系。对我来说它看起来像一个错误。

编辑:

在我的例子中,SomeClass 是一个工厂类,它生成视图实例或/并保留视图实例。我这样做了几年没有问题。 IBOutlet UIView 视图左侧的连接项目符号;* 刚刚消失。我有许多 xib 文件,其中文件所有者设置为单个工厂类(在这篇文章中为 SomeClass)生成自定义视图。

【问题讨论】:

  • 您确定要将事物连接到文件的所有者吗?
  • 谢谢大卫。是的,请参阅我在帖子中添加的编辑。

标签: ios xcode6 protocols xib iboutlet


【解决方案1】:

协议只是为类中需要包含的内容制定蓝图。在协议中声明 IBOutlet 并不会神奇地将这个属性添加到任何遵守协议的类中。

您必须将IBOutlet UIView*添加到SomeClass的界面中,然后您才能连接它。

此外,在协议中声明 IBOutlet 完全没有意义。 协议应该声明一个接口或 API - 实现方式应该取决于遵守协议的类。因此,声明属性是有问题的,但您应该声明方法(getter 或 setter)。

在您的情况下,这意味着您会将其添加到您的协议中:

- (UIView*)view;

你的班级 SomeClass 可以选择通过这样的属性来实现它:

@property (nonatomic, strong) IBOutlet UIView* view;

【讨论】:

  • “在协议中声明 IBOutlet 并不会神奇地将这个属性添加到任何遵守协议的类中。”根据我的经验,是的,如果 xib 的所有者继承自该协议,您可以在 xib 的所有者中看到出口。问题是我只是使用协议声明来访问视图,而无需在协议中设置任何 setter 或 getter 方法。
  • 他们肯定不会。 (developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…) 但是,您正在强制编译器通过合成称为视图的东西来创建属性。我不知道为什么会这样:)
  • 尝试将@property 行添加到SomeClass 的标题中,而不是synthesize 指令。这真的应该工作。编辑:您甚至可以将其添加到实现文件中。标题中属性的存在是隐含的。
猜你喜欢
  • 2018-01-19
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多