至少有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
&它的文本需要经常更新,哪种方法是正确的方法?
答案 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)。