我在使用 block 和继承时遇到了一些极端困难。
我在 .h 文件中声明了一个 block :
void (^block)(BOOL);
在 .m 中初始化它:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
block = ^(BOOL noshow)
{
if(noshow){
AutoTracView.hidden = YES;
MarineTracView.hidden = YES;
}
};
}
return self;
}
现在我将它和 UIVIEw 实例一起传递给 UIViewController 的类别:
NSDictionary *const collection = [NSDictionary dictionaryWithObjectsAndKeys: //make global
@"1", AutoTracView,
@"2", MarineTracView,
nil];
[self renderView:[current_unit.unit_type intValue] onCollection:(NSDictionary *)collection withBlock:block];
在 UIViewController+extensions.m 中:
-(void)renderView:(int)value onCollection:(NSDictionary *)collection withBlock:block
{
block(TRUE);
NSString *index = [NSString stringWithFormat:@"%d", value];
UIView *view = [collection objectForKey:index];
view.hidden = NO;
}
不幸的是,block(TRUE) 抛出编译错误:“被调用的对象类型 id 不是函数或函数指针”
好吧,所以我很绝望,只是试着让 block 的东西工作,所以我删除了 block 作为参数调用。并在确实有效的 Controller 中调用它。但是随后出现了另一个问题:
NSDictionary *const collection = [NSDictionary dictionaryWithObjectsAndKeys: //make global
@"1", AutoTracView,
@"2", MarineTracView,
nil];
上面那句话失败了:
-[UIView copyWithZone:]: unrecognized selector sent to instance 0x6ee2b80
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView copyWithZone:]: unrecognized selector sent to instance 0x6ee2b80'
我不允许传递我的 UIView 实例吗?
这是它的头文件:
@property (weak, nonatomic) IBOutlet UIView *AutoTracView;
@property (weak, nonatomic) IBOutlet UIView *MarineTracView;
我现在觉得做任何事情都被困住了。这看起来像是一个由两部分组成的问题,但实际上我放弃了传递 block 的概念,只是寻找关于错误“[UIView copyWithZone:]: unrecognized selector sent to instance”的想法
最佳答案
一个问题是您对 dictionaryWithObjectsAndKeys:
的调用。我想你想让 UIViews 成为对象,数字字符串成为键,但是你编码它的方式,你正在使字符串成为值,而 UIViews 成为键。 UIView 没有实现 NSCopyable,所以它们不能用作键。您应该在调用中颠倒顺序,如下所示:
NSDictionary *const collection = [NSDictionary dictionaryWithObjectsAndKeys: //make global
AutoTracView, @"1",
MarineTracView, @"2",
nil];
真的,如果你只想给它们数字索引,你可以使用 NSArray 而不是 NSDictionary,但没有理由说这两种方法都行不通。
关于iphone - Objective-C 错误 : [UIView copyWithZone:]: unrecognized selector sent to instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10745362/