如何创建可重用按钮

时间:2013-03-07 21:28:53

标签: xcode object button subclass

我是Xcode和Objective c的新手。我想创建一个具有特定外观的按钮(可能是导航栏的UIBarButtonItem),我将在不同的视图中重复使用。我已经搜索了很长时间,但无法弄清楚如何。

是否适合继承UIBarButtonItem?我试图这样做,但我很快就在脑海中。一旦我创建了.h和.m文件作为UIBarButtonItem的子类,那么我是否必须实例化一个UIBarButtonItem?那些文件不会自动为我创建一个按钮对象(从父类导入),我可以将其称为self?在它自己的子类中实例化一个按钮似乎很奇怪。

我想做的一件事就是添加一行

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

但我不知道如何使用该属性创建可重复使用的按钮。

即使这是创建可重复使用的自定义按钮的完全错误的方法,我显然需要提高对对象的理解,因此非常感谢我对误解的解释!

请?

1 个答案:

答案 0 :(得分:9)

您可以在不进行子类化的情况下执行此操作 - 通过创建类别(在Objective-C中执行操作的首选方式)。使用类别,您可以为对象提供自定义方法,而无需对其进行子类化。您无法(轻松)提供自定义属性,但在您的情况下这与此无关。

使用类别

这是您的类别标题文件的外观:

//  UIButton+StyledButton.h

#import <UIKit/UIKit.h>

@interface UIButton (StyledButton)
- (void) styleButton; 
@end

然后在实现文件中:

//
//  UIButton+StyledButton.m
//

#import "UIButton+StyledButton.h"

@implementation UIButton (StyledButton)

- (void) styleButton {
    //style your button properties here
    self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
}

(&#39; self&#39;指的是按钮对象,它也获取您在类别中编写的自定义方法。)

要使用它,#import "UIButton+StyledButton.h"那么你可以做这种事......

on viewDidLoad {
    [super viewDidLoad];
    UIButton* myButton = [[UIButton alloc] initWithFrame:myFrame];
    [myButton styleButton];
}

使用子类

子类化的等价物看起来像这样:

标题文件......

//  MyCustomButton.h

#import <UIKit/UIKit.h>

@interface MyCustomButton : UIButton
- (id)initWithCoder:(NSCoder *)coder;
- (id)initWithFrame:(CGRect)frame;
@end

实施档案......

//  MyCustomButton.m

#import "MyCustomButton.h"

@implementation MyCustomButton

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self styleButton];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        [self styleButton];
    }
    return self;
}

- (void) styleButton {
    //style your button properties here
    self.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
}

您提供了两个init方法 - initWithFrame是在代码中分配/启动对象时调用的方法; initWithCoder是系统调用的init方法,如果从storyboard或xib加载对象。

要在代码中创建一个自定义按钮,就像使用任何其他对象一样分配/ init:

MyCustomButton* button = [[MyCustomButton alloc] initWithFrame:buttonFrame];

您也不会分配/初始化超类实例,这是在子类调用initWithFrame:时由[super initWithFrame:frame]方法完成的。 self指的是您的自定义子类实例,但包含来自它的超类的所有(公共)属性和方法 - 除非您已在子类中实现了覆盖。

要在storyboard / xib中使用子类按钮,只需拖出常规按钮,然后将其类型设置为Identity Inspector中的自定义按钮类。当按钮从storyboard / xib加载到视图中时,会自动调用initWithCoder方法。

更新

从您的评论中,您似乎仍然存在一些混淆,所以这里有一些高度压缩的去混淆的笔记...

远离子类化UINavigationController,除非你真的知道自己在做什么。这很少需要。

navController接口上的按钮是其包含的viewControllers的属性。查找navigationItem的{​​{1}}属性(类似地 - 在UIViewController的情况下 - 视图控制器具有UIToolbar属性)。这允许导航控制器具有上下文感知能力。

&#39; viewDidLoad&#39;在我的例子中假设是常规的toolbarItems。我的示例也是常规UIViewController上与UIBUtton 没有正式关系的类别。

在尝试使用UIBarButtonItem继承自UIBarButtonItem)之前,尝试首先使用常规ViewController获取UIButton类别。

UIButton没有UIBarbuttonItem,因为组织条形图(initWithFrameUINavigationBar) - 在这种情况下是导航控制器 - 负责它&#39} ;最终的尺寸和定位。 viewController控制barButtonItems的相对顺序,以及它们是出现在左侧还是右侧,以及它的外观和(某些方面)外观,但其余部分由NavController决定。