IBOutlet创建的不同方法

时间:2017-06-30 08:07:58

标签: ios objective-c iboutlet

至少有3种方法可以在Objective-C中创建IBOutlet,用于在Xcode 8中制作iOS 10应用程序。

方法1:在ViewController.h

@interface ViewController : UIViewController
@property (nonatomic, strong) UILabel *textLabel;
@end

方法2:在ViewController.m

的界面中
@interface ViewController () {
    IBOutlet UILabel *textLabel;
}

@end

方法3:在ViewController.m的界面中,使用@property

@interface ViewController () 
@property (nonatomic, strong) UILabel *textLabel;
@end

鉴于必须访问textLabel&它的文本需要经常更新,哪种方法是正确的方法?

2 个答案:

答案 0 :(得分:2)

这一切都取决于你是否需要你的插座可以访问包含插座以外的课程;通常我会劝阻这一点,因为保持视图控制器负责更新UI并且不将此任务传递给其他类是一种好习惯。有了这个说法,方法3 将是最好的选择,但是,如果你必须从另一个类访问你的对象,那么只需使用方法1 ,这样就暴露了在你的班级标题中。

方法2 使用iVars而不是对象属性,并且不是声明出口的正确方法,它甚至可能导致意外行为,因此最好避免使用此方法。

答案 1 :(得分:1)

您的代码中没有正确的<router-outlet name="project"></router-outlet> 。 Outlets是与Storyboard的连接。

方法1

这是一个属性。因为它在.h文件中,它可以从外部到达。 IBOutlet的Objective-C模式。

方法2

这是iVar。如果您不需要,请不要使用iVars。

方法3

这是一个属性。因为它在.m文件中,所以无法从外部访问。 public的Objective-C模式。

方法4

正确的private如下所示:

IBOutlet

这是一个简单的财产。您必须决定是否将它放在.h或.m文件中,具体取决于您是否要发布它。

@interface ViewController () @property (nonatomic, weak) IBOutlet UILabel *label; @end 只是使该属性可以连接到Storyboard。它是Xcode的注释,不会改变代码的语义。

编辑1:

正如Sulthan在评论中正确提到的那样:

  

在大多数情况下,正确的设计模式是隐藏出口,因为它是一个实现细节。外部类不应使用视图直接设置数据。

编辑2:

为什么“如果你不必使用iVars”(2)

基于意见:

我认为使用getter&amp; amp; setters(因此不直接访问变量)。在阅读IBOutlet(属性)和x = self.variable(局部变量)的内容时,代码也更容易阅读。

如果由于某种原因必须使用iVars,则通常会(并且我建议)在名称前添加x = variable_(iVar)。