Ios 创建IBOutlet的不同方法
至少有3种方法可以在Objective-C中创建Ios 创建IBOutlet的不同方法,ios,objective-c,iboutlet,Ios,Objective C,Iboutlet,至少有3种方法可以在Objective-C中创建IBOutlet,用于在Xcode 8中制作iOS 10应用程序 方法1:inViewController.h @interface ViewController : UIViewController @property (nonatomic, strong) UILabel *textLabel; @end @interface ViewController () { IBOutlet UILabel *textLabel; } @e
IBOutlet
,用于在Xcode 8中制作iOS 10应用程序
方法1:inViewController.h
@interface ViewController : UIViewController
@property (nonatomic, strong) UILabel *textLabel;
@end
@interface ViewController () {
IBOutlet UILabel *textLabel;
}
@end
@interface ViewController ()
@property (nonatomic, strong) UILabel *textLabel;
@end
方法二:在ViewController.m
@interface ViewController : UIViewController
@property (nonatomic, strong) UILabel *textLabel;
@end
@interface ViewController () {
IBOutlet UILabel *textLabel;
}
@end
@interface ViewController ()
@property (nonatomic, strong) UILabel *textLabel;
@end
方法3:在ViewController.m
的界面中,使用@property
@interface ViewController : UIViewController
@property (nonatomic, strong) UILabel *textLabel;
@end
@interface ViewController () {
IBOutlet UILabel *textLabel;
}
@end
@interface ViewController ()
@property (nonatomic, strong) UILabel *textLabel;
@end
鉴于必须访问
文本标签
,且其文本需要经常更新,那么哪种方法才是正确的方法?这取决于您是否需要您的插座才能访问包含插座以外的类;一般来说,我不鼓励这样做,因为让视图控制器负责更新UI,而不是将此任务传递给其他类是一种很好的做法。话虽如此,方法3将是最好的选择,但是,如果您确实必须从另一个类访问对象,那么只需使用方法1,即可将其显示在类标题中
方法2使用IVAR而不是对象属性,并且不是声明出口的正确方法,它甚至可能导致意外行为,因此最好避免使用此方法。这一切取决于您是否需要出口访问包含出口之外的类;一般来说,我不鼓励这样做,因为让视图控制器负责更新UI,而不是将此任务传递给其他类是一种很好的做法。话虽如此,方法3将是最好的选择,但是,如果您确实必须从另一个类访问对象,那么只需使用方法1,即可将其显示在类标题中
方法2使用IVAR而不是对象属性,并且不是声明出口的正确方法,它甚至可能导致意外行为,因此最好避免使用此方法。您的代码不包含正确的
IBOutlet
。插座连接到故事板
方法1
这是一处房产。由于它位于.h文件中,所以可以从外部访问它。public
的Objective-C模式
方法2
这是一个iVar。如果不需要,请不要使用IVAR
方法3
这是一处房产。由于它位于.m文件中,因此无法从外部访问它。private
的Objective-C模式
方法4
合适的IBOutlet
如下所示:
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UILabel *label;
@end
这是一个简单的属性。您必须根据是否要发布它来决定是否将其放入.h或.m文件中
IBOutlet
只是使属性能够连接到故事板。它是Xcode的注释,不会改变代码的语义
编辑1: 正如Sulthan在评论中正确提到的:
在大多数情况下,正确的设计模式是隐藏插座,因为这是一个实现细节。外部类不应直接使用视图设置数据
编辑2: 为什么“如果不必使用IVAR,就不使用IVAR”(2) 基于意见的:
我认为使用Goter和SeTeTs(因此不直接访问变量)是很好的面向对象编程实践。另外,正如您所知,在读取
x=self.variable
(属性)和x=variable
(局部变量)时,代码更容易阅读
如果出于某种原因必须使用iVars,通常(我建议)在名称前面加上
\uuu
x=_变量
(iVar)。您的代码不包含正确的IBOUTLE
。插座连接到故事板
方法1
这是一处房产。由于它位于.h文件中,所以可以从外部访问它。public
的Objective-C模式
方法2
这是一个iVar。如果不需要,请不要使用IVAR
方法3
这是一处房产。由于它位于.m文件中,因此无法从外部访问它。private
的Objective-C模式
方法4
合适的IBOutlet
如下所示:
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UILabel *label;
@end
这是一个简单的属性。您必须根据是否要发布它来决定是否将其放入.h或.m文件中
IBOutlet
只是使属性能够连接到故事板。它是Xcode的注释,不会改变代码的语义
编辑1: 正如Sulthan在评论中正确提到的:
在大多数情况下,正确的设计模式是隐藏插座,因为这是一个实现细节。外部类不应直接使用视图设置数据
编辑2: 为什么“如果不必使用IVAR,就不使用IVAR”(2) 基于意见的:
我认为使用Goter和SeTeTs(因此不直接访问变量)是很好的面向对象编程实践。另外,正如您所知,在读取
x=self.variable
(属性)和x=variable
(局部变量)时,代码更容易阅读
如果出于某种原因必须使用iVars,通常(我建议)在名称前面加上
\uuu
x=_variable
(iVar)。除了@Jacob King comments这是很好的洞察之外,尝试使用方法1作为外部类的公共访问。也要使属性变弱而不是变强,因为如果处理不当,不会增加保留周期或内存泄漏。除了@Jacob King comments(这是很好的洞察)之外,尝试使用方法1作为外部类的公共访问。也要使属性变弱而不是变强,因为如果处理不当,不会增加保留周期或内存泄漏。在大多数情况下,正确的设计模式是隐藏插座,因为这是一个实现细节。外部类不应直接使用视图设置数据。@Sulthan完全同意。我认为这更像是一个技术问题。这两种方法的区别是什么