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