【问题标题】:Connecting IBOutlets, variable, property or both?连接 IBOutlets、变量、属性或两者?
【发布时间】:2012-03-09 16:34:55
【问题描述】:

将 IB 与助手视图结合使用时,您可以控制并拖动 IB 中的元素到 .h 文件并创建一个出口。您可以将它拖到 2 个位置之一,在变量声明块内或块外。

如果你把它拖到变量块里,你会得到这样的结果:

@interface MyViewController : UIViewController {
    IBOutlet UIButton *foo;
}

将它拖到块外会给你类似....

@interface ViewController : UIViewController {
}
@property (retain, nonatomic) IBOutlet UIButton *foo;

我想过它们有何不同,我有点困惑。好的,我了解合成属性会产生一些魔力并在运行时创建实例变量(仅在 64 位/ARM 上)。所以我相信我理解这 2 个选项的工作原理。

什么是最好的选择?第一个选项生成的代码更少,看起来更简单。

第二个版本提供公共访问器/突变器,但我很少从课堂外访问插座(如果我这样做,它几乎总是使用封装)。从我开始 iOS 工作开始,我就一直使用这个选项。

我是否遗漏了什么,或者在大多数情况下我应该切换到基于变量的网点?

【问题讨论】:

    标签: ios properties iboutlet


    【解决方案1】:

    在属性声明中声明 IBOutlet 的能力比较新@property (retain, nonatomic) IBOutlet UIButton *foo;

    以前,您必须在花括号内声明IBOutlet UIButton *foo,然后合成属性。现在,在花括号中声明 IBOutlet 是多余的。

    您现在有两种选择来声明属性。选项 1 是在您的 .h 文件中声明它,这将使其公开。或者,您可以使用以下方法在 .m 文件中创建私有接口:

    @interface MYCLASS()
    @end
    

    并在那里声明您的属性。这是我的首选方式,除非我需要公开访问该属性(如果您遵守 MVC 约定,这应该是例外,而不是常态)。

    【讨论】:

    • 我大量使用类扩展,但我从未想过将它们用于 IBOutlets。我刚刚对此进行了一些测试,并且 IBAction 在类扩展中工作(甚至更好),但是 Xcode 支持非常糟糕。它坚持将方法声明填充在 .h 中,您必须手动将其移动到 .m 文件中。 +1 的想法。
    • 是的,我想我应该澄清一下。如果要使用经典的 Xcode 方式进行拖动,则必须将它们放在 .h 文件中。但是,在我看来,还有另一种更容易的方法。对于 IBActions,您甚至不需要在接口部分中声明它们。只需在您的 .m 文件中实现您的 IBAction,例如 - (IBAction) buttonPressed: (id) sender {};,然后使用助手编辑器,您就可以从情节提要按钮按住 ctrl 并拖动到 IBAction 实现以进行链接。对于私有 IBOutlets,您可以从情节提要中按住 ctrl-drag 到您的私有界面 @interface MYCLASS() @end
    【解决方案2】:

    简答:这两种方式都没有太大区别。

    长答案:如果你想要设置/修改器方法,然后拖到块外。如果您不关心方法并且只是要直接访问变量,那么将它们作为直接变量放入块中可能是要走的路。

    公众可见度: 如果您只是将IBOutlet 指定为变量,那么您可以使用@private@protected 来防止外部访问。如果您出于某种原因确实想要 @property,您仍然可以通过将属性移出 .h 并移至 .m 文件中的类扩展名来控制公共可见性。

    结论:我自己,我坚持使用直接变量声明,并在需要额外内容时保留其他选项。

    【讨论】:

      【解决方案3】:

      IBOutlets 最好在块内,除非你真的打算在 .m 文件中使用它。

      请记住,您可以两者兼得。变量块内部的那个基本上,在所有基础上,仅用于在 IBActions 中使用它时。

      该属性可以在 .m 文件中用于进一步自定义。

      同样,您可以同时使用两者,这取决于您使用它的程度。

      【讨论】:

      • 你会让哪些 IBOutlets 不在 .m 中使用? IBActions 并不真正需要它们,因为操作传入了引用。为什么我现在想要两者?如果编译器会在运行时为我添加实例变量并在我使用属性时为我管理它,那么手动添加它是否有用?
      • 如果您有需要在 .m 中进一步实现的东西,例如 web 视图,您只会想要两者。您需要变量 outlet 来连接它以执行操作,以及添加诸如主页、加载请求等功能的属性
      猜你喜欢
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 2017-10-29
      • 2013-09-03
      • 1970-01-01
      • 2011-11-30
      相关资源
      最近更新 更多