2012-08-31 5 views
7

データの変更を除いて、同じサブビュー数のスクロールビューを作成しようとしています。私がプログラム的にすべてをやりたいのであれば、そうすることができます:iOS:View Controllerを使用せずにXIBを使用してプログラムでプログラムを作成する方法

int width = 110; 
int count = 0; 
self.scrollView.contentSize=CGSizeMake(width*[items count],100); 

for (NSString *id in items) { 
    Item *item = [items objectForKey:id]; 
    CGRect frame = CGRectMake(count*width, 0, 100, 100); 
    UIView *itemSubview = [[UIView alloc] initWithFrame:frame]; 

    CGRect dataLabelFrame = CGRectMake(0, 52, 35, 30); 
    UILabel* dataLabel = [[UILabel alloc] initWithFrame: dataLabelFrame]; 
    dataLabel.text = @"Data specific to item"; // item.property or something 
    dataLabel.font:[UIFont systemFontOfSize:30]; 
    dataLabel.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]; 

    [itemSubview addSubview:dataLabel]; 
    [self.scrollView addSubview:itemSubview]; 
    [itemSubview release]; 
} 

すべていいです。さて、私のサブビューがもう少し複雑で、Interface Builderとxibアーカイブを使ってレイアウトしたいのであれば、同じことをどうやって行うのですか?これまでのところ私がしている:

  • は、私のXIBファイルを作成したクラスItemSubviewのものであると、ファイルの所有者を設定し、私をフックアップIBOutlet NSStringの* dataLabel
  • でのUIViewを拡張し、独自のカスタムビューコード、ItemSubviewを作成しました

    私はこれを行うと、私のitemSubviewが描かれます
    int width = 110; 
    int count = 0; 
    self.scrollView.contentSize=CGSizeMake(width*[items count],100); 
    
    for (NSString *id in items) { 
        Item *item = [items objectForKey:id]; 
        CGRect frame = CGRectMake(count*width, 0, 100, 100); 
        ItemSubview *itemSubview = [[ItemSubview alloc] initWithFrame:frame]; 
        [itemSubview setBackgroundColor:[UIColor colorWithRed:0.0 green:0.2 blue:0.0 alpha:0.2]]; // to see where it ends up 
    
        [[NSBundle mainBundle] loadNibNamed:@"ItemSubview" owner:itemSubview options:nil]; 
        itemSubview.dataLabel.text = @"Data specific to item"; // item.property or something 
        [self.scrollView addSubview:itemSubview]; 
        [itemSubview release]; 
    } 
    

    (私はitemSubviewの背景色を見ることができます)ではなく:コード内で、

その後、コンセントにラベルを付けますxibアーカイブにあったdataLabel。私は何が逃しているのか、理解していないのかなぜこれはプログラムでは動作しますが、xibファイルでは動作しませんか?

答えて

8

はこのようにそれを実行します。

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ItemSubview" owner:self options:nil]; 
    ItemSubview *itemSubview = [topLevelObjects objectAtIndex:0]; 

は、あなたのXIBファイルで、トップレベルのビューがクラスItemSubviewのものであり、dataLabelが正しくItemSubviewのコンセントにフックアップされていることを確認します。ファイルの所有者は空白のままにしてください。

+0

これは助けになりました。 itemSubviewはバックグラウンドとサイズのxibから出てきましたが、まだdataLabelのサブ・サブビューが表示されませんでした。 (xibに設定されているデフォルト値さえありません)。ファイルの所有者は空白で、dataLabelのコンセントはitemSubview(xibの唯一のトップレベルオブジェクト)に接続されています。デバッガにはラベルが正しい値で表示されていますが、画面に表示されません。うーん... – meriial

+0

それは奇妙です。 ItemSubviewクラスにNSString *であるIBOutletがあると書いてあることに気付きました。それはUILabel *であってはなりませんか?私はそれがおそらく質問のtypoだと思う。これを試すことができます:xibファイルを完全に削除し、Xcodeを再起動してxibファイルを再作成します。いつかXcodeがちょうどうんざりします。それ以外の場合は、サブビュー、ItemSubviewクラス、およびxibファイルのイメージを追加するために使用している正確なコードを投稿してください。 – Darren

+0

私の問題は、[itemSubview release]でした。だから、それを削除して、すべてが良いです。 – meriial

関連する問題