gpt4 book ai didi

macos - 如何在 ListView 中添加 subview ?

转载 作者:行者123 更新时间:2023-12-03 16:20:23 25 4
gpt4 key购买 nike

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

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

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

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

enter image description here

最佳答案

你写

i have to added one button and background image on cell xib and bind them with controller



听起来你已经继承了 PXListViewCell --为方便起见,我们将您的子类称为 TemplateListViewCell --并添加了 xib来自 TemplateListViewCell 的哪些实例将被加载
+[PXListViewCell cellLoadedFromNibNamed:bundle:reusableIdentifier:]

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

你写

when on button click i was set height of that cell is much bigger then other. that is done, and work fine



听起来这个按钮的操作是 TemplateListViewCell 上的方法。如
- (IBAction)toggleDetail:(id)sender
{
//Code to grow or shrink the height of [self frame].
//...
}

在我实现 -toggleDetail 的方法中,对 PXListView 的两个修改文件是必要的:
1.添加协议(protocol)方法
- (void)listView:(PXListView *)aListView setHeight:(CGFloat)height ofRow:(NSUInteger)row;

PXListViewDelegate协议(protocol)。
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] ,但不幸的是,这不起作用:如果用户隐藏细节——垂直缩小单元格——应该出现在屏幕上的新单元格不会。

你写

that is done, and work fine.



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

你写

but now i want to develop like after is witch cell has open in that cell i want to add some extra contain (Controller) on it, so how it will possible using given example? pls help me to give some suggest how it will be done.



听起来您想要 TemplateListViewCell 的实例如果它们被扩展,则包含额外的 View 。

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

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

更好但不太方便的设计似乎是在 PXListView 中跟踪此信息。本身。然而,为了这个问题,我将演示如何跟踪委托(delegate)中的单元格扩展。为此,我正在扩展 PXListViewDelegate协议(protocol)并对 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.设置 _expandedNO-[PXListViewCell prepareForReuse] :
- (void)prepareForReuse
{
_dropHighlight = PXListViewDropNowhere;
_expanded = NO;
}

注意:在 the sample PXListViewCell subclass, 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的委托(delegate)以正确处理新的委托(delegate)方法,您已准备好覆盖 [PXListViewCell setExpanded:]在你的子类中 TemplateListViewCell :
- (void)setExpanded:(BOOL)expanded
{
if (expanded) {
//add detail subviews
} else {
//remove detail subviews
}
[super setExpanded:expanded];
}

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

你写

i want to add some extra contain (Controller) on it



听起来您想向 TemplateListViewCell 添加 View Controller 而不是 View 。 .为此,请使用 NSBox并设置盒子的 contentView到您的 View Controller 的 view . (有关详细信息,请参阅 this answer。)

如果您打算只在 NSBox 中显示单个 View Controller 的 View 在扩展 TemplateListViewCell ,您只需 (1) 将属性添加到 TemplateListViewCell引用您的 View Controller 并 (2) 添加 NSBoxTemplateListViewCell xib 并设置其 contentView到相应的 View Controller 对 [cell setExpanded:YES] 的 View 并将其 contentView 设置为 nil[cell setExpanded:NO] .

关于macos - 如何在 ListView 中添加 subview ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com