在iOS中切换不同按钮的最佳方式?

在iOS中切换不同按钮的最佳方式?,ios,objective-c,cocoa-touch,cocoa-design-patterns,Ios,Objective C,Cocoa Touch,Cocoa Design Patterns,3个按钮,大量实现,在一个巨大的项目中。时尚的objective-c程序员如何解决这个问题 这更多的是一个关于设计模式的问题,但我认为这是相关的,我正在努力寻找答案 为了简化这个问题,假设我的应用程序中有3种按钮,我将大量使用它们。有一个非常重要按钮,一个重要按钮和不非常重要按钮,具有不同的样式:边框、角点、颜色等 我不想到处复制粘贴 UIButton *mybutton = [[UIButton alloc] initWithFrame:frame]; [myButton setBackGro

3个按钮,大量实现,在一个巨大的项目中。时尚的objective-c程序员如何解决这个问题

这更多的是一个关于设计模式的问题,但我认为这是相关的,我正在努力寻找答案

为了简化这个问题,假设我的应用程序中有3种按钮,我将大量使用它们。有一个
非常重要按钮
,一个
重要按钮
不非常重要按钮
,具有不同的样式:边框、角点、颜色等

我不想到处复制粘贴

UIButton *mybutton = [[UIButton alloc] initWithFrame:frame];
[myButton setBackGroundColor:[UIColor redColor];
[myButton.layer setBorderWidth:2.0];
[…]
我可以看到三种解决方案:

1/子类化。这3个按钮将是UIButton的子类,参数将在实现文件中设置。那样的话,我就只需要分配所需的按钮

ImportantButton *mybutton = [[ImportantButton alloc] initWithFrame:frame];
2/一些助手类(公共类方法、单例等)

3/在UI按钮上创建类别

#import "UIButton+Importantness.h"

UIButton *mybutton = [[UIButton alloc] initWithFrame:frame];
[myButton applyVeryImportantStyle];
我不知道这些解决方案中是否有一个比另一个更好,以及哪一个更好

我们的目标是拥有一个可蒙皮的应用程序,因此IB只是用来布局UI元素,而不是设计它们的样式


我希望这是一个合理的问题。感谢您的帮助。

您可以全局设置UI按钮的属性。像这样:

[[UIButton appearance] setBackgroundColor:<#(UIColor *)#>];
[[UIButton外观]setBackgroundColor:];
因此,由于您需要三个特定类型的按钮,请创建UIButton的3个子类,为它们全局设置属性,如上所述,并在应用程序中频繁使用


如果这不是您想要的,请告诉我。

我已经看到了许多带有自定义按钮的开放源代码,大多数情况下,它可以执行您指定的第一个方法,因为子类化对于处理UI之类的事情来说不是很完美,因为它并不是在每个场景中都能完美工作。只需创建按钮并添加所需的属性并添加到子视图中就是最好的方法。

这不会解决问题,因为它会为每个按钮创建属性并等待您的答案,但对于
UIButton
,UIAppearance仅限于
contentEdgeInsets
setTitleColor:forState:
setTitleShadowColor:forState:
setBackgroundImage:forState:
。是的……就是这样。如果它对您有帮助,请随时接受/投票:)@Dustt“…它不是在每个场景中都能完美工作”-如果不是每个场景,那么您认为是哪种场景?我的意思是为UI子类化UIButton,但为布局或框架和功能添加方法是可以的!我在另一个答案中提出了建议。谢谢,这是一个很好的答案。您所指的WWDC会议是什么?那么你会建议第二种回答,还是第四种工厂模式?例如:
VeryImportantButton*myButton=[buttonimportantnesmanager buildveryimportantbuttonwhithtitle:(NSString*)title]?会议从2012年开始,时间为216:iOS上的高级外观定制。我通常按照我建议的第一种方式来做,那就是,在我的视图控制器中,抓取我的按钮并自己设置它们的主题。除非我的大多数按钮是通过编程而不是在interface builder中创建的,否则我通常不会采用工厂方式。(顺便说一句,如果你喜欢我的另一个答案,请将它和问题一起投票,以便其他人更容易找到。)
[[UIButton appearance] setBackgroundColor:<#(UIColor *)#>];