我试图将我的一些“超级对象”分解为更易于管理的类,这些类具有单一(或至少有限)责任。
我刚刚遇到的一个问题是创建 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.