Objective-C错误:[UIView copyWithZone:]:向实例发送无法识别的选择器。

3
我使用块和继承遇到了一些极大的困难。
我在.h文件中声明了一个块:
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) 抛出了一个编译错误:"called object type id is not a function or function pointer"。
好吧,我变得绝望了,试图让 block 运作起来,所以我将其作为参数调用移除了。只在控制器中调用它确实有效。但是随之出现了另一个问题:
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;

我现在感觉无法做任何事情。这似乎是一个两部分的问题,但我已经放弃了通过块的概念,只是在寻找关于错误“[UIView copyWithZone:]:未识别的选择器发送到实例” 的想法。
3个回答

3

一个问题是你调用了dictionaryWithObjectsAndKeys:方法。我认为你想将UIView作为对象,数字字符串作为键,但是你编写的方式是将字符串作为值,UIView作为键。UIView没有实现NSCopyable接口,因此不能用作键。你应该反转调用顺序,像这样:

NSDictionary *const collection = [NSDictionary dictionaryWithObjectsAndKeys: //make global
                                  AutoTracView, @"1",
                                  MarineTracView, @"2",
                                  nil];

事实上,如果你只想给它们数字索引,你可以使用NSArray而不是NSDictionary,但无论如何都可以工作。


0
字典的键被复制了,你的代码尝试使用UIView的实例作为键。我猜测你的参数顺序有误,应该使用字符串作为键。在使用可变参数列表初始化字典时,值首先出现。

0

方法定义怎么样?是像这样的吗:

-(void)renderView:(int)value onCollection:(NSDictionary *)collection withBlock:(void(^)(BOOL))block;

也许你没有以正确的方式在类别中定义方法

希望这可以帮到你


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接