将iOS应用移动到使用Storyboard,同时以编程方式保留一些视图

时间:2012-07-06 03:02:48

标签: ios5 uiview xcode-storyboard

我正在尝试将现有项目转换为使用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添加了所有子视图?

1 个答案:

答案 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元素值的最常见位置。