2

いくつかの同様のビューを作成する必要があります
簡単な方法で、xib でいくつかのビューを作成します (各フルスクリーン)

そして、このxibのビューを使用するためのView Controllerがあります。コードは次のようになります。

NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:nil options:nil];
[self.view addSubview:[views objectAtIndex:aIndex]];

この時点で、ビューは正常に表示されます。

これらのビューにはいくつかのボタンがあるので、ビューごとにアウトレットを接続します

悪いことが起こった

原因でアプリがクラッシュしました

キャッチされない例外 'NSUnknownKeyException'、理由: '[<NSObject 0x969db50> setValue:forUndefinedKey:]: このクラスは、キーのキー値コーディングに準拠していません

分析:
私の xib ファイルの「ファイル所有者」は設定されていますが、xib と唯一のビュー コントローラーの間に接続がありません。

ビューのボタンのポインタを取得するにはどうすればよいですか?

4

4 に答える 4

2

次のように実行できます。

NSNib*      aNib = [[NSNib alloc] initWithNibNamed:@"MyGreatNib" bundle:nil];
NSArray*    topLevelObjs = nil;

for (SomeClass *obj in myOwnerObjects) {
    topLevelObjs = nil;

    if (![aNib instantiateNibWithOwner:obj topLevelObjects:&topLevelObjs])
    {
        NSLog(@"Warning! Could not load nib file.\n");
        return;
    }

    for (id topLevelObj in topLevelObjs) {
        if ([topLevelObj isKindOfClass:[NSView class]]) {
            NSView *otView = (NSView *)topLevelObj;
            // set frame...
            [self addSubview:otView];
        }
    }
}   
于 2012-08-28T10:56:43.487 に答える
1

-loadView のデフォルト実装は、ビューを作成するか NIB をロードします。私の知る限り、-loadView での作成時のビューの最終的なサイズを知る方法はありません。これ[[UIScreen mainScreen] bounds].は、-viewDidLoad などのメソッドでゼロ フレーム ビューで作業するのが難しい場合があるためです。

1 行の実装は次のようになります。

- (void)loadView {
    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
}

ビューがどのコンテキストで表示されるかわからないため、自動サイズ変更マスクを設定する必要はありません。呼び出し元は、正しいフレーム、自動サイズ変更マスク、および同様の外部属性を設定する責任があります (私はこれらをこのように呼びます)。

UINavigationController メソッドでこれを想像してください。

// we are pushing new VC, view is accessed for the first time
pushedVC.view.frame = CGRectMake(...);

正しいフレームを設定していますが、-setFrame: の直前に -loadView が呼び出されます。したがって、-viewDidLoad の間、サブビューと内部自動サイズ変更をセットアップできるようにするためだけに、ゼロ以外のフレームが一時的に表示されます。この後、正しいフレームが設定され、-viewWillAppear: で最終フレームが作成されます。

于 2014-08-13T09:55:36.153 に答える
0

おっと...
何かを見つけました。

UINib* xib = [UINib nibWithNibName:@"MyXibName" bundle:nil];
UIView* view = [[xib instantiateWithOwner:self options:nil] lastObject];  

できます!

于 2012-08-28T11:01:14.890 に答える
0

クラスUIViewを定義することにより、必要に応じてxibを設計できます

.m ファイルのコード:

NSArray* objects = [[NSBundle mainBundle] loadNibNamed:@"Interface" owner:nil options:nil];

UIView* mainView = [objects objectAtIndex:0];

for (UIView* view in [mainView subviews]) {
    if([view isKindOfClass:[UILabel class]])
    {
        UILabel* label = (UILabel*)view;
        //....As You Wish...
    }
}
于 2012-08-28T11:25:44.553 に答える