【问题标题】:Where should i define all my view objects?我应该在哪里定义我的所有视图对象?
【发布时间】:2016-02-05 09:38:04
【问题描述】:

好的,到目前为止,我一直在 .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 中,我不知道它们应该在哪里,我在互联网上浏览了一些示例代码并且无法找到线索。定义所有按钮的正确位置是什么?因为我现在在一家公司工作,所以我必须遵守告诉我的约定。

【问题讨论】:

  • 所以每个包含该头文件的实现文件都会获得自己对UIButton的引用?这是完全错误的做事方式。
  • 您需要遵循众多教程之一。扔掉你现有的,删除这个问题。
  • 方法取决于要求。如果您需要以编程方式创建多个按钮,那么您需要模块化用于创建按钮的代码并在需要时调用该方法。另一方面,如果您不需要以编程方式进行操作,则转到情节提要并在其中添加按钮(使用约束并设置按钮的 UI)并为操作添加 IBAction 方法并与 UIButton 连接。
  • @TejasK 一点也不。你不会得到答案,因为它太宽泛了。
  • 你确定你的导师说按钮引用应该进入单独的方法,而不是作为实例变量或属性?

标签: ios objective-c uibutton uilabel viewdidload


【解决方案1】:

IBOutlets 属性保留在头文件 (*.h) 之外,并在视图控制器接口扩展的实现文件 (*.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 文件 创建一个新文件。
  • 在您的项目的文件类型前缀中,带有类的名称(例如: 地图样式)。
  • 为文件类型选择类别
  • 选择您要为其创建类别的(对于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

在您的视图控制器实现文件 (*.m) 中导入您的类类别并修改您的方法:

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

这将从UIButton 的类类别中调用样式方法的@selector。正如您所想象的那样,您可以从应用程序中的每个视图控制器中删除大量样板代码。

【讨论】:

  • 值得注意的是,方法名称应以小写字母开头
  • 正确,想暴露前缀的需要。谢谢你让我知道伙计。
【解决方案2】:

您的导师说:“所有这些按钮都应该在一个单独的方法中,而不是在 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 中构建这些按钮,那就更好了。

【讨论】:

  • 显示btnCustomFacebookLogin的声明。
猜你喜欢
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
相关资源
最近更新 更多