ブロックと継承を使用して、これに非常に困難を感じています。
.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;
}
今、UIViewController のカテゴリに UIVIEw インスタンスと同様にそれを渡します。
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 は関数または関数ポインターではありません」
よし、必死になって、ブロックを機能させようとするだけなので、パラメーター呼び出しとしてブロックを削除します。動作するコントローラー内で呼び出すだけです。しかし、別の問題が発生します。
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;
私は今、何をするにも閉じ込められていると感じています。これは 2 つの部分からなる質問のように思えるかもしれませんが、実際にはブロックを渡すという概念を放棄し、「[UIView copyWithZone:]: 認識されないセレクターがインスタンスに送信されました」というエラーに関するアイデアを探しているだけです。