0

我试图将我的一些“超级对象”分解为更易于管理的类,这些类具有单一(或至少有限)责任。

我刚刚遇到的一个问题是创建 UIBarButtonItem 的特定实例的对象。在现在的类中,我首先定义了一个 UIButton,然后将所有充当该按钮图标的图像作为子视图(例如,按钮代表对设备的访问/控制,我使用按钮图像来显示该设备的当前信号强度)。此外,该按钮正在侦听来自设备对象的 NSNotifications,以表示信号强度的变化,或者设备是否断开连接。按下按钮会向设备发送一条消息以断开连接。作为 RootViewController 的属性,所有这些代码现在都可以正常工作。但是,我想将它拉到它自己的类中,因为该按钮由多个类共享,它只会用不必要的方法使控制器混乱。

我尝试使用下面的 init 创建一个单独的类。但是,这不起作用,因为用于按钮的 self 与最终由 [UIBarButtonItem alloc] 创建的 self 不同,并且当 NSNotification 或按钮按下尝试向“self”选择器发送消息时,该对象已被释放。问题是,我不确定如何创建一个对象(由类定义),它只是另一个类的实例,而不是对象的属性(因为它目前是用于 RootViewController)。

对我的问题进行编辑和补充说明

MyClass 目前是 UIBarButtonItem 的子类。但是,我不想像这样使用它:[[MyClass alloc] initWithCustomView:]。我希望 [MyClass alloc] init] 自己完全创建自定义视图 - 换句话说,这个类的全部意义在于完全包含此按钮创建自身、管理其子视图并采取适当行动所需的一切当它被按下时。(我可以使用 [MyClass setupButton] 之类的公共方法和 UIBarButtonItem 类型的公共属性轻松使 MyClass 成为 NSObject。但是,我认为这看起来不对,因为那时该类仅用于创建按钮,但它不是按钮本身。)

@interface MyClass : UIBarButtonItem
@end

@implementation MyClass
- (id)init {
    if (self = [super init]) {

        UIImage *defaultButton = [[UIImage imageNamed:@"...
        UIImage *defaultButtonPressed = [[UIImage imageNamed:@"....
        UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 30)];
        [button setBackgroundImage:defaultButton forState:UIControlStateNormal];
        [button setBackgroundImage:defaultButtonPressed forState:UIControlStateHighlighted];
        [button addTarget:self action:@selector(deviceButtonPressed) forControlEvents:UIControlEventTouchUpInside];

        //Then several UIImageViews that are added as subviews of the button, initially hidden

        //Then set up the NSNotification listener

        //Finally
        self = [[UIBarButtonItem alloc] initWithCustomView:button];
    }

    return self;
}

//Then several functions to handle hiding and unhiding the subviews depending on the received device notifications, and a function to handle the button press and sending the message back to the device.
4

2 回答 2

1

在我看来,您想扩展UIBarButtonItem,而不是在您的init方法中创建它的实例。尝试从此更改您的类声明(在您的类的 .h 文件中):

@interface MyClass : NSObject

对此:

@interface MyClass : UIBarButtonItem

然后只需返回self您的init方法。设置self一个值通常是一个坏主意。

如果您不确定这里发生了什么,您正在创建 UIBarButtonItem 的子类。这让您的子类可以扩展超类的功能。如果您感到困惑,您应该看一下面向对象语言中的子类化/类继承,以了解发生了什么。本指南记录了类在 Objective-C 中的工作方式。

于 2013-02-12T04:58:52.333 回答
1

这不是 Cocoa 中的初始化工作方式。请阅读Cocoa 核心能力指南中的“初始化”

init运行此方法时,您的对象已被分配。您不应该将self指针重新分配给另一个分配。

你的类应该首先调用它的超类指定的初始化器self = [super initWithWhatever:obj];,然后设置它自己的属性。

于 2013-02-12T05:00:26.087 回答