我应该在哪里定义所有视图对象?

时间:2016-02-05 09:38:05

标签: ios objective-c uibutton uilabel viewdidload

好的,直到现在我一直在.h文件中声明我的所有视图对象。例如:

 UIButton *btnCustomFacebookLogin;

在我的.m文件中定义如下:

btnCustomFacebookLogin = [UIButton buttonWithType:UIButtonTypeCustom];
btnCustomFacebookLogin.backgroundColor = [UIColor darkGrayColor];
btnCustomFacebookLogin.frame = CGRectMake(0,0,180,40);
btnCustomFacebookLogin.center = CGPointMake(self.view.center.x, 200);
[btnCustomFacebookLogin setTitle: @"Facebook Login" forState: UIControlStateNormal];
[btnCustomFacebookLogin addTarget:self action:@selector(facebookLoginButtonClicked) forControlEvents: UIControlEventTouchUpInside];
[self.view addSubview:btnCustomFacebookLogin];

我的应用程序中还有一些按钮,这些按钮都在我的

中定义
- (void)viewDidLoad

我从我的导师那里检查过,他告诉我所有这些按钮应该是一个单独的方法而不是在viewDidLoad中,我不知道它们应该在哪里,我在互联网上查看了一些示例代码,但是不能找到线索。定义所有按钮的正确位置是什么?因为我现在在公司工作,所以我必须遵守告诉我的惯例。

2 个答案:

答案 0 :(得分:0)

IBOutlets属性保留在头文件(* .h)之外,并在View Controller的接口扩展中将其声明为实现文件(* .m)。

在您的实施文件(* .m)中:

@interface MyViewController ()
@property (nonatomic, weak) IBOutlet UIButton *myButton;
@end

请记住将属性行为nonatomic设置为默认情况下每个属性都会获得atomic行为,并且在使用UI对象时,不需要使它们对线程安全。将其设置为weak,因为您不是该对象的直接所有者,其生命周期属于您的故事板(假设您使用故事板)。

Meet Doshi关于使用viewDidLoad并在其中执行选择器,对UI元素进行初始设置是正确的。它使您的代码清晰易读。

我可以称之为:

- (void)styleUI {
   //insert your code here
}

如果您发现自己以相同的方式在不同的视图控制器中设置特定的UIButton样式,那么为了避免样板代码,您可以为UIButton创建自己的类别类别,并在一个地方指定相同的样式。

  • 选择 Objective-C文件创建一个新文件。
  • 在具有类名称的项目的文件类型前缀中(示例: 的 MAPStyling )。
  • 为文件类型选择类别
  • 选择要为其创建类别的UIButton选择UIButton)。

在实现文件(* .m)中的类别类中添加样式的方法:

- (void)map_applyFacebookStyle
   // insert your code here but instead to name of your button refer to self.
   self.title = @"Facebook Login";
}

通过在@interface部分添加方法签名,在您的类别的标题文件中公开方法。

@interface UIButton (MAPStylig)
- (void)map_applyFacebookStyle;
@end

在View Controller实施文件(* .m)中导入您的类别并修改您的方法:

- (void)styleUI {
  [btnCustomFacebookLogin map_applyFacebookStyle];
}

这会从@selector上的班级类别中调出您的样式方法的UIButton。正如您可以想象的那样,您可以从应用程序中的每个View Controller中删除大量样板代码。

答案 1 :(得分:-1)

你的导师说,“所有这些按钮应该是一个单独的方法,而不是在viewDidLoad中”。表示您将所有按钮的框架和属性设置为viewDidLoad方法。他没有说你不能将所有对象都定义为.h文件。所以他说,你已经做到了其他方法。只需使用以下代码即可。

我想,现在你这样做了: -

- (void)viewDidLoad
{
    btnCustomFacebookLogin = [UIButton buttonWithType:UIButtonTypeCustom];
    btnCustomFacebookLogin.backgroundColor = [UIColor darkGrayColor];
    btnCustomFacebookLogin.frame = CGRectMake(0,0,180,40);
    btnCustomFacebookLogin.center = CGPointMake(self.view.center.x, 200);
    [btnCustomFacebookLogin setTitle: @"Facebook Login" forState: UIControlStateNormal];
    [btnCustomFacebookLogin addTarget:self action:@selector(facebookLoginButtonClicked) forControlEvents: UIControlEventTouchUpInside];
    [self.view addSubview:btnCustomFacebookLogin];
}

所以,只需将此代码放入一个方法并从viewDidLoad中调用此方法,如下所示: -

- (void)viewDidLoad
{
    [self settingPropertiesOfButtons];
} 

- (void)settingPropertiesOfButtons
{
    //insert your code here..
    btnCustomFacebookLogin = [UIButton buttonWithType:UIButtonTypeCustom];
    btnCustomFacebookLogin.backgroundColor = [UIColor darkGrayColor];
    btnCustomFacebookLogin.frame = CGRectMake(0,0,180,40);
    btnCustomFacebookLogin.center = CGPointMake(self.view.center.x, 200);
    [btnCustomFacebookLogin setTitle: @"Facebook Login" forState: UIControlStateNormal];
    [btnCustomFacebookLogin addTarget:self action:@selector(facebookLoginButtonClicked) forControlEvents: UIControlEventTouchUpInside];
    [self.view addSubview:btnCustomFacebookLogin];
}

就是这样。如果您可以在.storyboard文件或.xib中构建这些按钮,那么它会更好。