3

我正在开发我的第一个 MAC 应用程序,我下载了一个 PxListView示例

我必须在单元格 xib 上添加一个按钮和背景图像并将它们与控制器绑定,当点击按钮时,我设置的该单元格的高度比其他单元格大得多。完成,并且工作正常。

但是现在我想像在女巫细胞在那个细胞中打开之后那样开发我想在它上面添加一些额外的包含(控制器),那么如何使用给定的例子呢?请帮我提出一些建议。
前喜欢点击按钮 在此处输入图像描述

小鸡按按钮后,我想像这样发展

在此处输入图像描述

4

1 回答 1

2

你写

我必须在单元格 xib 上添加一个按钮和背景图像并将它们与控制器绑定

听起来你已经子类化了PXListViewCell——为了方便起见,让我们调用你的子类TemplateListViewCell——并添加了一个xib从中TemplateListViewCell加载的实例

+[PXListViewCell cellLoadedFromNibNamed:bundle:reusableIdentifier:]

此外, 中还有一个[至少一个] 按钮TemplateListViewCell.xib

你写

当点击按钮时,我设置的那个单元格的高度比其他的要大得多。完成了,工作正常

听起来这个按钮有一个方法作为它的动作,TemplateListViewCell比如

- (IBAction)toggleDetail:(id)sender
{
    //Code to grow or shrink the height of [self frame].  
    //...
}

在我的实现方法中,需要对文件进行-toggleDetail两次修改:PXListView

1. 添加协议方法

- (void)listView:(PXListView *)aListView setHeight:(CGFloat)height ofRow:(NSUInteger)row;

PXListViewDelegate协议。

2. 添加属性

@property (nonatomic, assign) BOOL expanded;

PXListViewCell.

我的实现-toggleDetail看起来像这样:

- (IBAction)toggleDetail:(id)sender
{
    BOOL wasExpanded = [self expanded];

    NSRect oldFrame = [self frame];
    CGFloat oldHeight = oldFrame.size.height;
    CGFloat newHeight = oldHeight;

    CGFloat heightIncrement = 0.0f;
    if (wasExpanded) {
        heightIncrement = -80.0f; //use whatever value is appropriate
    } else {
        heightIncrement = 80.0f;  //use whatever value is appropriate
    }
    newHeight += heightIncrement;

    [[[self listView] delegate] listView:[self listView] setHeight:newHeight ofRow:[self row]];
    [[self listView] reloadData];

    BOOL isExpanded = !wasExpanded;
    [self setExpanded:isExpanded];
}

[[self listView] reloadRowAtIndex:[self row]];用代替似乎更好[[self listView] reloadData],但不幸的是,这不起作用:如果用户隐藏细节——垂直缩小单元格——应该出现在屏幕上的新单元格不会。

你写

完成,并且工作正常。

听起来您能够成功实现类似于-[TemplateListViewCell toggleDetail:].

你写

但是现在我想像在女巫细胞在那个细胞中打开之后那样开发我想在它上面添加一些额外的包含(控制器),那么如何使用给定的例子呢?请帮我提出一些建议。

听起来您希望 的实例在TemplateListViewCell扩展时包含额外的视图。

将此代码放入 中似乎很诱人-[TemplateListViewCell toggleDetail],但这不会像我们希望的那样成功。问题是,我们需要处理扩展单元格被滚动出视图并滚动回视图的情况。

为了做到这一点,我们需要有一个扩展的概念,它在PXListViewCell子类实例的使用之外仍然存在:我们要么需要跟踪PXListView自身的扩展,要么跟踪它的委托。

更好的——但不太方便的——设计似乎是跟踪这些信息PXListView本身。然而,为了这个问题,我将演示如何跟踪委托中的单元格扩展。为此,我正在扩展PXListViewDelegate协议并对PXListView文件进行其他更改:

1. 添加方法

- (void)listView:(PXListView *)aListView setExpanded:(BOOL)expanded atRow:(NSUInteger)row;
- (BOOL)listView:(PXListView *)aListView expandedAtRow:(NSUInteger)row;

PXListViewDelegate.

2. 添加方法

- (void)setCell:(PXListViewCell *)cell expandedAtRow:(NSUInteger)row
{
    if ([[self delegate] respondsToSelector:@selector(listView:expandedAtRow:)]) {
        [cell setExpanded:[[self delegate] listView:self expandedAtRow:row]];
    }
}

PXListView.

3. 来自-[PXListView setCell:expandedAtRow:]_-[PXListView layoutCells]

- (void)layoutCells
{   
    //Set the frames of the cells
    for(id cell in _visibleCells)
    {
        NSInteger row = [cell row];
        [cell setFrame:[self rectOfRow:row]];


        [self setCell:cell expandedAtRow:row];


        [cell layoutSubviews];
    }

    NSRect bounds = [self bounds];
    CGFloat documentHeight = _totalHeight>NSHeight(bounds)?_totalHeight:(NSHeight(bounds) -2);

    //Set the new height of the document view
    [[self documentView] setFrame:NSMakeRect(0.0f, 0.0f, NSWidth([self contentViewRect]), documentHeight)];
}

并从-[PXListView layoutCell:atRow:]

- (void)layoutCell:(PXListViewCell*)cell atRow:(NSUInteger)row
{
    [[self documentView] addSubview:cell];
    [cell setFrame:[self rectOfRow:row]];

    [cell setListView:self];
    [cell setRow:row];
    [cell setHidden:NO];

    [self setCell:cell expandedAtRow:row];
}

4. 设置_expanded为:NO_-[PXListViewCell prepareForReuse]

- (void)prepareForReuse
{
    _dropHighlight = PXListViewDropNowhere;
    _expanded = NO;
}

注意:在示例PXListViewCell子类中MyListViewCell与 一起分发PXListView,调用的实现-[MyListViewCell prepareForReuse]失败[super prepareForReuse]。确保此调用是在[TemplateListViewCell prepareForReuse]

- (void)prepareForReuse
{
    //...
    [super prepareForReuse];
}

需要对-[TemplateListViewCell toggleDetail:]. 线

[self setExpanded:isExpanded];

需要替换为

[[[self listView] delegate] listView:[self listView] setExpanded:isExpanded atRow:[self row]];

一旦你设置好你PXListView的委托以正确处理新的委托方法,你就可以[PXListViewCell setExpanded:]在你的子类中重写TemplateListViewCell

- (void)setExpanded:(BOOL)expanded
{
    if (expanded) {
        //add detail subviews
    } else {
        //remove detail subviews
    }
    [super setExpanded:expanded];
}

替换//add detail subviews为您自己的代码,该代码以编程方式添加您想要的详细子视图,并替换//remove detail subviews为删除您想要的详细子视图的代码,首先检查它们是否存在。

你写

我想在上面添加一些额外的包含(控制器)

听起来您想将视图控制器而不是视图添加到您的TemplateListViewCell. 为此,请使用一个NSBox并将框设置contentView为您的视图控制器的view. (有关此的详细信息,请参阅此答案。)

NSBox如果您打算只在扩展视图中显示单个视图控制器的视图TemplateListViewCell,您可以(1)添加一个属性来TemplateListViewCell引用您的视图控制器,(2)添加一个NSBoxTemplateListViewCellxib 并将其设置contentView为适当的视图控制器的视图[cell setExpanded:YES]和将其 contentView 设置为nilon [cell setExpanded:NO]

于 2012-12-28T21:41:09.020 回答