0

MyViewでは、 と の 2 つのビューがありMySubview、どちらも がサブクラスであるとしましょうUIView

View.h:

@interface MyView : UIView <ProgressCallback>
@property (retain, nonatomic) IBOutlet UIProgressBar *progress;

- (id) initWithFrame: (CGRect) frame;
- (void) progressUpdated: (NSNumber) newProgress;

@end

View.m

@implementation MyView
@synthesize progress = _progress;

- (id)initWithFrame:(CGRect)frame;
{
    self = [super initWithFrame:frame];

    if (self){
        NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"MyViewNibFile"
                                                              owner:nil
                                                            options:nil];

        if ([arrayOfViews count] < 1){
            [self release];
            return nil;
        }

        View *newView = [[arrayOfViews objectAtIndex:0] retain];
        [newView setFrame:frame];

        [self release];
        self = newView;

        self.progress.progress = .25 // This will work and change it.
    }

    return self;
}

- (void) progressUpdated: (NSNumber) newProgress {
     self.progress.progress = newProgress.floatValue; // This also works!
}

AppleのドキュメントとStackOverflowを参照して、UIViewのサブクラスを作成するこの方法を見つけました。それは機能し、コールバックに基づいて進行状況を設定でき、表示されます。私の問題は、これをサブビューしたいときです。

MySubview.h

@interface MySubview : MyView
@property (retain, nonatomic) IBOutlet UIImageView *image;
@end

MySubview.m

@実装 MySubview

- (id)initWithLabel: (UIImageView *) image andWithFrame:(CGRect)frame;
{
    self = [super initWithFrame:frame];

    if (self){
        NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"MySubViewNibFile"
                                                              owner:nil
                                                            options:nil];

        if ([arrayOfViews count] < 1){
            [self release];
            return nil;
        }

        MySubbiew *newView = [[arrayOfViews objectAtIndex:0] retain];
        [newView setFrame:frame];

        [self release];
        self = newView;

        self.progress.progress = .25 // This will work and change it.
        self.image = image; // Also works
    }

    return self;
}

サブクラスをどのように初期化しても、サブクラスで進行状況バーが機能しません。初期化中に設定できますが、ゼロではありませんが、初期化後の私の見解とは明らかに一致しません。私は自分自身を解放しているという事実に関係していると思いますが、タイプ View のクラスを返したい場合、他の選択肢はありません。クラス名を Subview に変更するだけで、同じスタイルの init を使用します。コールバックが実際に呼び出され、コードが変更されますが、表示は更新されません。すべてがペン先に正しく接続されており、サイズを除いて同一であり、この場合は画像があります。

(サンプル コードをできる限りシンプルかつ明確にするために最善を尽くしました。成功しなかった場合はお知らせください。更新します。)

UIViewを適切にサブクラス化するにはどうすればよいですか? 私はドキュメントを読みましたが、何も啓発的ではありませんでしたが、お気軽に正しい方向に向けてください。具体的には、すべてが正しいアイテムを指すようにするには、何をオーバーライドする必要がありますか? つまり、ディスプレイ上のものです。

4

2 に答える 2

0

メソッドを呼び出しinitWithFrame:た後、self の値をオーバーライドしていますinitWithLabel:andWithFrame:

この行:

self = newView;

MyView スーパークラスの init メソッドで作成された self の値をオーバーライドするため、すべてのカスタマイズが失われます。

于 2012-08-12T16:40:54.080 に答える
0

あなたもこの問題を抱えているなら、私がそうだったので、おそらく間違っているでしょう。

一般的:

コンテンツをいじっている場合は、オーバーライドしますUIViewController

ジオメトリをいじっている場合は、オーバーライドしますUIView

これで問題は解決しましたが、技術的には私のコードの問題は wattson12 が言ったことでした。

于 2012-08-13T14:42:30.090 に答える