Xcode 如何创建可重用的按钮

Xcode 如何创建可重用的按钮,xcode,object,button,subclass,Xcode,Object,Button,Subclass,我不熟悉Xcode和objective c。我想创建一个具有特定外观的按钮(可能是一个UIBarButtonItem,用于导航栏),我将在不同的视图中重复使用它。我找了很久,但不知道怎么找 是否适合将伊巴布顿主义归为亚类?我试着那样做,但很快就被打断了。一旦我创建了.h和.m文件作为uiBarButtonim的子类,那么我是否必须实例化uiBarButtonim?这些文件是否不会自动为我创建一个按钮对象(从父类导入),我可以将其称为self?在自己的子类中实例化按钮似乎很奇怪 我想做的一件事是添

我不熟悉Xcode和objective c。我想创建一个具有特定外观的按钮(可能是一个UIBarButtonItem,用于导航栏),我将在不同的视图中重复使用它。我找了很久,但不知道怎么找

是否适合将伊巴布顿主义归为亚类?我试着那样做,但很快就被打断了。一旦我创建了.h和.m文件作为uiBarButtonim的子类,那么我是否必须实例化uiBarButtonim?这些文件是否不会自动为我创建一个按钮对象(从父类导入),我可以将其称为self?在自己的子类中实例化按钮似乎很奇怪

我想做的一件事是添加行

button.titleLabel.lineBreakMode=NSLineBreakByWordWrapping

但是我不知道如何用这个属性创建可重用的按钮

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


请?

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

使用类别

以下是类别头文件的外观:

//  UIButton+StyledButton.h

#import <UIKit/UIKit.h>

@interface UIButton (StyledButton)
- (void) styleButton; 
@end
('self'指的是button对象,它还获取您在类别中编写的自定义方法。)

要使用它,
#导入“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
您提供了两个init方法-
initWithFrame
是在代码中alloc/initing对象时要调用的方法
initWithCoder
是从情节提要或xib加载对象时系统调用的init方法

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

MyCustomButton* button = [[MyCustomButton alloc] initWithFrame:buttonFrame];
您也不会alloc/init超类实例,这是通过子类中的
initWithFrame:
方法在调用
[super-initWithFrame:frame]
时完成的
self
引用您的自定义子类实例,但这包括它的超类中的所有(公共)属性和方法,除非您在子类中实现了重写

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

更新

从你的评论来看,你似乎仍然有一些困惑,所以这里有一些高度压缩的去模糊注释

除非您真的知道自己在做什么,否则不要将UINavigationController子类化。很少有必要

navController界面上的按钮是其包含的ViewController的属性。查找
UIViewController
navigationItem
属性(类似地,对于
UIToolbar
,视图控制器具有
toolbarItems
属性)。这使得导航控制器能够感知上下文

我的示例中的“viewDidLoad”假定位于常规的
UIViewController
中。我的示例也是常规
UIBUtton
上的一个类别,它与
UIBarButtonItem
没有正式关系

在尝试使用
UIBarButtonItem
(它不继承自
UIButton
)之前,首先尝试让UIButton类别与常规ViewController一起使用


uiBarButtonim
没有
initWithFrame
,因为组织条(
UINavigationBar
UIToolbar
)的东西——在本例中是导航控制器——负责其最终大小和定位。viewController控制barButtonItems的相对顺序,以及它们是显示在左侧还是右侧,以及内容和(某些方面的)外观,但其余部分由NavController决定

无需子类化即可做到这一点,只需创建一个类别(Objective-C中做事情的首选方式)。使用类别,您可以为对象提供自定义方法,而无需对其进行子类化。您不能(轻松地)提供自定义属性,但在您的情况下,这是不相关的

使用类别

以下是类别头文件的外观:

//  UIButton+StyledButton.h

#import <UIKit/UIKit.h>

@interface UIButton (StyledButton)
- (void) styleButton; 
@end
('self'指的是button对象,它还获取您在类别中编写的自定义方法。)

要使用它,
#导入“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
您提供了两个init方法-
initWithFrame
是在代码中alloc/initing对象时要调用的方法
initWithCoder
是从情节提要或xib加载对象时系统调用的init方法

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

MyCustomButton* button = [[MyCustomButton alloc] initWithFrame:buttonFrame];
您也不会alloc/init超类实例,这是通过子类中的
initWithFrame:
方法在调用
[super-initWithFrame:frame]
时完成的
self
引用您的自定义子类实例,但这包括它的超类中的所有(公共)属性和方法,除非您在子类中实现了重写

要在故事板/xib中使用子类按钮,只需拖出一个常规按钮,然后在Identity Inspector中将其类型设置为自定义按钮类。这个