0

ビューを視覚的にレイアウトできるように、既存のプロジェクトをストーリーボードを使用するように変換しようとしています。ただし、プログラムでいくつかのビューを他のビューにロードする必要があります。

(補足として..私はFlashActionScriptでプログラミングしていましたが、iOSでのプログラミングはまったく新しいもので、Objective-Cの入門書しか持っていなかったので、解決しようとしている途方もない「穴」がいくつかあります) 。

私のレイアウトは次のようなものです。

カレンダーには、セルを作成するためのサブビュー('gridView')があります。私はもともとこのビューをプログラムで作成し、カレンダーセル(日付を示す四角)に独自のサブビューを追加しました。gridViewをストーリーボードに正常に追加しましたが、カレンダーセル(gridViewによってプログラムで追加されたもの)が表示されます。正しい日付をカレンダーに表示することができましたが、ストーリーボードを使用して壊れており、プログラムでgridViewの作成に戻る必要があるかどうか、または実際にやりたいことを実行できるかどうかを判断しようとしています。ストーリーボード。

だからここに私は立ち往生しています:

gridViewでは、draw rectを使用して、すべてのセルサブビューを作成します。

// lay down the individual cells to build the calendar
    // 7 days across x 6 weeks down
    const CGSize gCellSize = {self.frame.size.width/7, (self.frame.size.height-20)/6};
    for(int w=0;w<6;w++) //6 weeks in the calendar
    {
        for(int d=0;d<7;d++) //7 days in a week
        {
            // ------------------ setting up the CELLVIEW ----------------------//
            CGRect calendarCellRect=CGRectMake(d*gCellSize.width,w*gCellSize.height+20, gCellSize.width, gCellSize.height);
            CalendarCellView *cellView=[[CalendarCellView alloc] initWithFrame:calendarCellRect];
            [self addSubview:cellView];
        }
    }

これが私の問題です。プログラムですべてを作成すると、gridViewが親ビューのサブビューとして読み込まれ、cellViewが適切にレイアウトされました。gridViewがロードされた後、親ビューは、これらのサブビューをループし、各cellViewに適切な日付を追加するメソッド(displayDates-gridView内)を続行します。

しかし、gridViewをストーリーボードに追加したので、displayDatesメソッドを呼び出す前に、セルのサブビューがロードされていることを確認する必要があります。

-(void)displayDates:(NSArray *)selectedMonthDates previousMonthVisibleDates:(NSArray *)previousMonthDates followingMonthVisibleDates:(NSArray *)followingMonthVisibleDates
    {   
        int cellNum=0;
        NSArray *displayDates[]={previousMonthDates,selectedMonthDates,followingMonthVisibleDates};
        for (int i=0; i<3; i++)
        {
            for (NSDate *d in displayDates[i])
            {            
                CalendarCellView *cell=[self.subviews objectAtIndex:cellNum];
                [cell resetState]; //initialize all properties within the CellView

                cell.date=d; // set the cell's date property to be equal to the respective date collected from the displayDate array            
                cellNum++;
            }
        }
        [self setNeedsDisplay];
    }

では、gridViewのdrawRectがすべてのサブビューを追加したことを確認してから、それらのサブビューに日付を追加する方法を教えてください。

4

1 に答える 1

1

レイアウトフェーズは、レンダリングフェーズの前に実行されます。でサブビューを作成してdrawRectいる場合は、すでに間違っています。すべての「最後の瞬間」のレイアウトは、オーバーライド-layoutSubviews:するUIViewサブクラスに対して実行する必要があります。

テーブルビューセルに追加するときは、サブビューを直接追加しcell.contentViewないように追加する必要がありますcell.viewテーブルビューセルの構造については、テーブルビュープログラミングガイドの段落テーブルビューセルの詳細」を参照してください。

また、配列内のサブビューの順序に依存しないでください。代わりに、サブビュー( )にタグを付ける必要があります。これは、 nibまたはストーリーボードcellView.tag = dからロードした場合、ビュー階層でサブビューの順序が保証されないためです。を呼び出すと、サブビューを取得できます。cell.contentView.viewWithTag:tag

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathまた、テーブルビューセルでUI要素の値を設定する最も一般的な場所である日付を設定してみませんか。

于 2012-07-06T05:17:52.243 に答える