我正在尝试将现有项目转换为使用Storyboard,以便我可以直观地展示我的观点。我仍然需要以编程方式将一些视图加载到其他视图中。
(作为旁注..我曾经在Flash ActionScript中编程,对于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作为子视图加载到父视图,并且cellViews布局得很好。加载gridView后,父视图将继续使用循环遍历这些子视图的方法(displayDates - inside gridView),并将其适当的日期添加到每个cellView。
但是现在我已经将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添加了所有子视图?
答案 0 :(得分:1)
布局阶段在渲染阶段之前完成。如果您要在drawRect
中创建子视图,那么您已经做错了。对于您覆盖的-layoutSubviews:
子类,所有“最后时刻”布局都应在UIView
中完成。
添加到表格视图单元格时,您应该将子视图添加到cell.contentView
,而不是直接添加到cell.view
。有关表格单元格的剖析,请参阅Table View Programming Guide段仔细查看表格视图单元格。
此外,您不应该依赖数组中子视图的顺序。相反,您应标记您的子视图(cellView.tag = d
),因为从 nib 或 storyboard 。您可以通过调用cell.contentView.viewWithTag:tag
来获取子视图。
为什么不在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中设置日期,这是在表格视图单元格中设置UI元素值的最常见位置。