gpt4 book ai didi

iOS 子类化自定义类

转载 作者:可可西里 更新时间:2023-11-01 03:39:18 27 4
gpt4 key购买 nike

我无法概括我对类继承的想法。我被支持在应用程序中创建类似界面的仪表板,并且我可能在该仪表板 View 上有 10 个小部件/dashlet。所有这些小面板/小部件的外观基本相同,顶部有标题、边框、顶部有一排按钮和一个图表。假设我创建了一个名为“Dashlet”的 UI View 子类,其中包含属性和 socket ,并创建了具有适当布局和连接 socket 等的 XIB 文件。

现在我想创建该“Dashlet” View 的几个子类,它们只会以不同的方式处理数据,并绘制不同的图形。我当前的代码看起来像这样:

Dashlet.h

@interface Dashlet : UIView{
@private
UILabel *title;
UIView *controls;
UIView *graph;
}
@property (weak, nonatomic) IBOutlet UILabel *title;
@property (weak, nonatomic) IBOutlet UIView *controls;
@property (weak, nonatomic) IBOutlet UIView *graph;

-(Dashlet*)initWithParams:(NSMutableDictionary *)params;
-(void)someDummyMethod;
@end

在 Dashlet.m 中

- (id) init {
self = [super init];
//Basic empty init...
return self;
}

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {

}
return self;
}

-(id)initWithParams:(NSMutableDictionary *)params
{
self = [super init];
if (self) {
self = [[[NSBundle mainBundle] loadNibNamed:@"Dashlet" owner:nil options:nil] lastObject];
//some init code
}
return self;
}

现在假设我创建了一个名为 CustomDashlet.h 的子类:

@interface CustomDashlet : Dashlet
@property (nonatomic, strong) NSString* test;
-(void)testMethod;
-(void)someDummyMethod;
@end

和 CustomDashlet.m

-(id)init{
return self;
}

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {

}
return self;
}

-(id)initWithParams:(NSMutableDictionary *)parameters
{
self = [super initWithParams:parameters];
if (self) {
//do some stuff
}
return self;
}

这有点管用,但我需要重写父类(super class)中声明的一些方法,甚至添加一些我自己的方法。每当我尝试在 CustomDashlet.m 中做这样的事情时

[self someDummyMethod] 或什至 [self testMethod] 我收到这样的异常错误:

NSInvalidArgumentException', reason: '-[Dashlet testMethod]: unrecognized selector sent to instance 

我这样做对吗?我错过了什么?我应该以其他方式完成这项工作吗?如果有人有任何建议,请随时分享您的想法,感谢您提供的所有帮助。

最佳答案

问题是

SalesDashlet *sales = [[SalesDashlet alloc] initWithParams:nil];

返回一个 SalesDashlet 实例,如预期的那样,而是一个 Dashlet 实例。这是发生的事情:

  • [SalesDashlet alloc] 分配 SalesDashlet 的实例。
  • initWithParams: 的子类实现被这个实例调用,并调用 self = [super initWithParams:parameters]
  • initWithParams 的父类(super class)实现 discards self用从 Nib 文件加载的新实例覆盖它。这是一个实例的 Dashlet
  • 返回这个新实例。

因此SalesDashlet *sales“只是”一个Dashlet,并调用任何子类它的方法抛出“未知选择器”异常。

您不能更改 Nib 文件中加载的对象类型。你可以创造第二个包含 SalesDashlet 对象的 Nib 文件。如果子类的主要目的是要添加其他方法,那么最简单的解决方案就是添加这些方法在 Dashlet 类的 Category 中。

关于iOS 子类化自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19913202/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com