0

我正在尝试将现有项目转换为使用情节提要,以便我可以直观地布置我的视图。我仍然需要以编程方式将一些视图加载到其他视图中。

(作为旁注..我曾经在 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 已经添加了所有子视图?

4

1 回答 1

1

布局阶段在渲染阶段之前完成。如果您在其中创建子视图,drawRect那么您已经做错了。应该为您覆盖-layoutSubviews:的子类完成所有“最后时刻”布局。UIView

添加到表格视图单元格时,您应该cell.contentViewcell.view直接添加子视图。请参阅Table View Programming Guide段落A Closer Look at Table-View Cells了解表格视图单元格的解剖结构。

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

以及为什么不在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath表格视图单元格中设置 UI 元素值的最常见位置设置日期。

于 2012-07-06T05:17:52.243 回答