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;
}

今、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:]: 認識されないセレクターがインスタンスに送信されました」というエラーに関するアイデアを探しているだけです。

4

3 に答える 3

3

1 つの問題は、への呼び出しdictionaryWithObjectsAndKeys:です。UIViews をオブジェクトに、数字の文字列をキーにしたいと思いますが、コード化した方法では、文字列を値に、UIViews をキーにしています。UIView は NSCopyable を実装していないため、キーとして使用できません。次のように、呼び出しの順序を逆にする必要があります。

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

実際、数値インデックスを与えるだけなら、NSDictionary の代わりに NSArray を使用できますが、どちらの方法でも機能しない理由はありません。

于 2012-05-24T21:54:20.967 に答える
0

辞書のキーがコピーされ、コードはのインスタンスをUIViewキーとして使用しようとします。引数の順序が間違っていて、文字列をキーとして使用することを意図していると思われます。可変引数リストを使用して辞書を初期化する場合、値が最初に来ます。

于 2012-05-24T21:56:05.320 に答える
0

メソッド定義はどうですか?次のようなものです:

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

カテゴリ内のメソッドを正しい方法で定義していない可能性があります

お役に立てれば

于 2012-05-24T21:33:04.347 に答える