iphone - Objective-C 错误 : [UIView copyWithZone:]: unrecognized selector sent to instance

标签 iphone objective-c

我在使用 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/

相关文章:

iphone - 如何转移View但不关闭View数据?

ios - 为了重绘图层,请在CAShapeLayer上使用setNeedsDisplay

ios - 想通过xcode开启定位服务

ios - AVPlayerLayer 不在 iOS 11 中呈现离线 HLS 视频

jquery - 如何检查用户是否在iPhone设置中限制了相机

iphone - 在 Objective C 中生成 SHA256 字符串

ios - 我们什么时候使用saveAccount :(ACAccount *)account of ACAccountStore class?

ios - UIAppearance,在 Interface Builder 中查看结果?

objective-c - 格式数字字符串,到许多尾随/数字/零

ios - 使用 UITableViewCell 作为 tableHeaderView