【问题标题】:How to create a reusable button如何创建可重复使用的按钮
【发布时间】:2013-03-25 05:24:46
【问题描述】:

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

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

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

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

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

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

请?

【问题讨论】:

    标签: xcode object button subclass


    【解决方案1】:

    你可以在没有子类化的情况下做到这一点——通过创建一个类别(在 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;
    }
    

    ('self'指的是按钮对象,它也获取了你在类中编写的自定义方法。)

    要使用它,#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;
    }
    

    您提供了两个初始化方法 - initWithFrame 是在代码中分配/初始化对象时调用的方法; initWithCoder 是系统在从情节提要或 xib 加载对象时调用的 init 方法。

    要在代码中创建您的自定义按钮之一,您可以像处理任何其他对象一样分配/初始化:

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

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

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

    更新

    从您的 cmets 看来,您似乎仍然存在一些困惑,所以这里有一些高度压缩的去混淆注释...

    除非你真的知道你在做什么,否则不要继承 UINavigationController。很少需要。

    navController 界面上的按钮是它所包含的 viewController 的属性。查找UIViewControllernavigationItem 属性(类似地 - 在UIToolbar 的情况下 - 视图控制器具有toolbarItems 属性)。这允许导航控制器具有上下文感知能力。

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

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

    UIBarbuttonItem 没有initWithFrame,因为组织栏的东西(UINavigationBarUIToolbar)——在这种情况下是导航控制器——负责它的最终大小和定位。 viewController 控制 barButtonItems 的相对顺序,以及它们是出现在左侧还是右侧,以及它的内容和(某些方面)的外观,但其余的取决于 NavController。

    【讨论】:

    • 非常感谢您的详尽解释。如果有人有耐心解释更多事情,这让我提出了更多问题。 (1) 我不能完全让这个类别起作用。我创建了类别文件并将 viewDidLoad 位添加到自定义导航控制器。我将其中一个导航控件的类更改为我的自定义类。但是我在跑步时没有看到按钮出现。 UINavigationController 是否适合尝试创建按钮?
    • (2) 这不可能用 UIBarButtonItem 而不是 UIButton 吗?为什么前者没有 initWithFrame 方法?我以为前者继承了后者?
    • @mkc842... 我已经发布了一个更新,希望对您有所帮助,而不仅仅是增加更多的混乱!
    • 嘿,再次感谢您的帮助。我现在很清楚了。在犹豫了一下之后,我正在全力以赴理解 xCode。如果您有时间,我将非常感谢您在 stackoverflow.com/questions/16501270/…stackoverflow.com/questions/16501270/… 上对我的新问题的专业知识
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    相关资源
    最近更新 更多