2

UIView私のiOSアプリにはルートビューコントローラーがあり、実行時にいくつかのカスタムを追加したいと思います。これらのカスタムビューウィジェットは小さく、サイズやラベルテキストなどを除いて基本的にほとんど同じであるため、私はこれらのカスタムビューウィジェットと呼んでいます。

ウィジェット用に.hと.m、および.xibファイルを作成しました。私のルートビューコントローラviewDidLoadでは、これを行います:

TestMyView *cell = [[[NSBundle mainBundle] loadNibNamed:@"TestMyView" owner:self options:nil] objectAtIndex:0];    
[self.view addSubview: cell];

正常に動作します。しかし、私はまだ理解できません:

  • mylabelをIBOutletとしてカスタムUIViewクラス.hファイル"[<TestViewController 0x7517210> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key mylabel"に追加すると例外が発生するのはなぜですか。UILabel(UILabelをIBにドラッグしてから、controlキーを押しながら.hにドラッグします)ビューの作成時にラベルテキストを変更する必要があります。また、IBOutletを追加しなかったのに、なぜTestViewControllerに文句を言うのかよくわかりませんが、カスタムビューの.hクラスですか?
  • 次に、ラベルテキストを正しい方法で変更するにはどうすればよいですか。ウィジェット用のViewControllerは必要ないと思うので、作成したくありません。5〜6個のウィジェットを作成する必要があるので、5〜6個のビューコントローラーを作成する必要がありますか?
  • ウィジェットを作成するときにinitWithCoderが呼び出されないようです。私はアップルのドキュメントライブラリがnibファイルからビューをロードするとこのメソッドが呼び出されると言っているのを見ました。

私がこれを説明するのが苦手だと思うなら、ここに私のプロジェクトコードがあります: https ://dl.dropbox.com/u/43017476/custom.tar.gz

4

2 に答える 2

4

あなたは近くにいます。いくつかのメモ。

1番目-ニップからビューをロードする場合、「所有者」は、ニップによるプロパティ(IBOutlets)参照を持つクラスです。それはおそらくTestMyViewのインスタンスになります。通常、カスタムビューを作成し、それ自体のペン先をロードします(以下に示すように)。

2番目-loadNibNamedは、UIVIEWではなくNSARRAYを返します。したがって、ビューを配列から引き出したいと思うでしょう。

カスタムビュー(ウィジェット)を作成する例を次に示します。

CGRect frame = CGRectMake(nextLeft, nextTop, tileWidth, tileHeight);
TestMyView *widget = [[TestMyView alloc] initWithFrame:frame andFoo:foo];
[widget setWidgetTappedBlock:^{
    // handle tap for this widget
}];
[self.widgetContainerView addSubview:widget];

これは、カスタムビューの実装の一部です。

@implementation TestMyView

- (id)initWithFrame:(CGRect)frame andFoo:(Foo *)foo
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setBackgroundColor:[UIColor clearColor]];
        NSArray *nibObjects=[[NSBundle mainBundle] loadNibNamed:@"TestMyView" owner:self options:nil];
        [self addSubview:[nibObjects objectAtIndex:0]];
        // More initialization code
    }
    return self;
}

@end

そしてインターフェース:

@interface ProductTileView : UIView

@property (nonatomic, weak) IBOutlet UIView *view;
@property (nonatomic, copy) ProductTappedBlock widgetTappedBlock;

- (id)initWithFrame:(CGRect)frame andFoo:(Foo *)foo;

@end

編集: PSこの例では、loadNibに送信された所有者がビューコントローラである「self」であるためにエラーが発生します。ビューコントローラには「myLabel」プロパティがありませんが、カスタムビューにはあります。

于 2013-02-16T17:52:24.240 に答える
0

rootViewに追加する前に、それらを開始する必要があると思います。

TestMyView *cell = [[TestMyView alloc]initWithNibName:@"TestMyView" bundle:[NSBundle mainBundle]];
[self.view addSubview: cell];
于 2013-02-16T16:48:09.433 に答える