Ios5 将iOS应用程序移动到使用故事板,同时以编程方式保留某些视图

Ios5 将iOS应用程序移动到使用故事板,同时以编程方式保留某些视图,ios5,uiview,xcode-storyboard,Ios5,Uiview,Xcode Storyboard,我正在尝试将我现有的项目转换为使用故事板,这样我就可以直观地展示我的视图。不过,我仍然需要以编程方式将一些视图加载到其他视图中 (顺便说一句……我以前是用Flash ActionScript编程的,对iOS编程很陌生,只学过Objective-C的初级课程,所以我有一些巨大的“漏洞”正在努力克服) 我的布局是这样的: 日历有一个子视图来创建其单元格-“gridView”。我最初以编程方式创建了这个视图,它又为日历单元格(显示日期的方块)添加了自己的子视图。我已经成功地将gridView添加到故事

我正在尝试将我现有的项目转换为使用故事板,这样我就可以直观地展示我的视图。不过,我仍然需要以编程方式将一些视图加载到其他视图中

(顺便说一句……我以前是用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];
        }
    }
//放置各个单元格以构建日历
//7天内x 6周内
const CGSize gCellSize={self.frame.size.width/7,(self.frame.size.height-20)/6};

对于(int w=0;w而言,布局阶段在渲染阶段之前完成。如果您在
drawRect
中创建子视图,则您已经做错了。所有“最后一刻”布局都应在
-layoutSubview:
中完成,以覆盖
UIView
子类

当添加到表格视图单元格时,您应该将子视图添加到
单元格。contentView
而不是直接添加到
单元格。view
中。有关表格视图单元格的解剖结构,请参见段落表格视图单元格的详细信息

此外,您不应该依赖数组中子视图的顺序。相反,您应该标记子视图(
cellView.tag=d
),因为从nib或故事板加载时,视图层次结构中不保证子视图的顺序。您可以通过调用
cell.contentView.viewWithTag:tag
来获得子视图


为什么不在
-(UITableViewCell*)tableView:(UITableView*)tableView cell for rowatinexpath:(nsindepath*)indepath
中设置日期,这是设置表视图单元格中UI元素值的最常见位置。

我可能不应该使用“cell”作为一个视图名,因为它不在一个表中,所以我认为它是误导性的。我试图为保存日历上每个日期的“正方形”想出一个名称,我想出了“单元格”.啊,我明白了。但我强烈建议不要在drawRect中进行布局,并建议您使用标记来访问子视图,而不是依赖视图层次结构中的特定顺序。苹果已经多次强调了这一点。我不确定视图布局是否应该进入drawRect,因此感谢您指导我远离它。最好的位置在哪里o从视图中添加子视图?-布局子视图?实际上,我最终将创建日历“正方形”的位移动到了一个级别,并将[self addSubview:cellView]更改为[gridView addSubview:cellView],这似乎有帮助…暂时不必担心大量的注释:)是的,layoutSubviews绝对是您在UIView子类中执行随时间变化的部分布局的地方。在init中创建子视图是常见的模式,但在layoutSubviews中设置框架。
-(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];
    }