当用户双击一行中的一行时,我需要我的应用程序打开一个窗口NSTableView
.我在寻找有关如何实现这一目标的信息或示例时遇到了一些困难.任何人都能指出我正确的方向吗?
OS X应用程序中的标准突出显示颜色为蓝色.
是否可以将其更改为其他颜色,例如灰色?
请注意,我NSTableView
从OS X 10.7开始使用新的基于视图的可用.
我目前正在尝试学习一些Cocoa(使用Cocoa Programming for Mac OS X).在其中一个练习中,我们设置了一个只有一列的NSTableView,作为一个列表.
令我恼火的是,在Interface Builder中,我找不到让(唯一)列始终占用NSTableView的全宽度的方法.因此,当实际上只有一列时,总会看起来有两列.
任何的想法 ?
我有一个NSTableView,委托和数据源指向我的控制器.我试过实施
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
Run Code Online (Sandbox Code Playgroud)
方法,但无论我返回什么,表总是在数据中显示"表视图单元格".我可能做错什么的想法?附上两张照片,显示我已正确设置了委托(它还显示了正确的行数).
请注意,我也尝试过返回@"Hello World"
所有内容,但我得到了相同的结果.
我正在以编程方式制作NSTableView,但由于某些原因,无论我做什么,我都无法让darn headerView显示出来.我必须以编程方式执行此操作而不使用IB,因为我实际上是在名为clozure cl的IDE中开发此小部件,这是一个包含可可桥的lisp ide.最初我认为这个问题可能是由我的开发环境引起的,但我只是在Xcode中使用目标C创建了一个例子,似乎问题仍然存在.我所做的非常简单:
我在IB中创建了一个窗口,在我的awkefromnib方法中,我创建并设置了一个表视图,这里是代码:
- (void)awakeFromNib {
mydatasource *data = [[mydatasource alloc] init];
NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"id"];
NSTableView *table = [[NSTableView alloc] initWithFrame: [[self
contentView]frame]];
[table setDataSource:data];
[table addTableColumn:column];
[table addTableColumn:column];
[[self contentView] addSubview:table];
}
Run Code Online (Sandbox Code Playgroud)
这是我的数据源对象的代码:
- (int)numberOfRowsInTableView:(NSTableView *)aTableView
{
printf("NUM ROwS");
return 4;
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
printf("THE OTHER ONE");
return @"OKAY";
}
Run Code Online (Sandbox Code Playgroud)
使用这段代码,我得到一个包含两个列和四行的窗口,每个单元格显示字符串"OKAY",除了表没有标题外,这一切都很好.这可能是有意义的,除非我查看表头方法,它有一个初始化的头,其框架的值是有意义的.我只是想知道为什么我没有看到它.我需要做一些特殊的魔术才能显示标题吗?我似乎无法在文档中找到任何线索.再一次,必须以编程方式完成这个lisp ide,所以没有建议使用我知道将有一个工作headerView的IB没有帮助.非常感谢.
我想以编程方式在我的表视图中选择一行,我相信我会使用selectRowIndexes:byExtendingSelection:
(这是一个委托方法吗?).另一件事是我如何使用该方法选择第二行(在编程术语第1行)?
我在自定义视图中有文本字段NSOutlineView
.编辑其中一个单元格需要单击,暂停和另一次单击.第一次单击选择表视图行,第二次单击单击在字段中绘制光标.双击单元格(允许您在基于单元格的表格视图中进行编辑)仅选择该行.
我想要的行为:单击一下即可更改选择并进行编辑.
我需要覆盖什么才能获得此行为?
我读过其他一些帖子:
NSTextField
轻量级的模式似乎并不适用于基于视图的表视图,其中电池的观点都是从笔尖实例化.NSTextField
像这个解决方案描述的子类化,但我mouseDown
没有调用我的重写方法.被覆盖awakeFromNib
和viewWillDraw
(在这篇文章中提到)被称为.当然,mouseDown
如果我将文本字段放在表视图之外的某处,则会调用它.相比之下,NSSegmentedControl
我的单元格视图中的a更改其值而不先选择行.
以下是根据公认的回复改编的工作解决方案:
在大纲视图子类中:
-(void)mouseDown:(NSEvent *)theEvent {
[super mouseDown:theEvent];
// Forward the click to the row's cell view
NSPoint selfPoint = [self convertPoint:theEvent.locationInWindow fromView:nil];
NSInteger row = [self rowAtPoint:selfPoint];
if (row>=0) [(CellViewSubclass *)[self viewAtColumn:0 row:row makeIfNecessary:NO]
mouseDownForTextFields:theEvent];
}
Run Code Online (Sandbox Code Playgroud)
在表格单元格视图子类中:
// Respond to clicks within text fields only, because other clicks …
Run Code Online (Sandbox Code Playgroud) 我正在动态地向NSTableView添加行.当我发出[table reloadData]时,我可以看到滚动视图移动,如果我手动移动它,我可以看到表上的新值.但是如何自动滚动?
我有一个简单的单列,基于视图的NSTableView,其中包含可以拖动的项目以重新排序它们.在拖放过程中,我想制作它,以便在鼠标下方的位置打开待删除项目的间隙.当您拖动以重新排序曲目时,GarageBand会执行类似的操作(此处为视频:http://www.screencast.com/t/OmUVHcCNSl).据我所知,在NSTableView中没有内置的支持.
有没有其他人试图将此行为添加到NSTableView并找到了一个很好的解决方案?我已经想到并尝试了几种方法而没有取得多大成功.我的第一个想法是通过发送-noteHeightOfRowsWithIndexesChanged:
我的数据源的-tableView:validateDrop:...
方法,然后返回正常高度的两倍,在拖动过程中将鼠标下方行的高度加倍-tableView:heightOfRow:
.不幸的是,我可以说,NSTableView在拖放期间不会更新其布局,因此尽管调用noteHeightOfRowsWithIndexesChanged:
,行高度实际上并未更新.
请注意,我正在使用基于视图的NSTableView,但我的行并不复杂,以至于如果这样做有助于实现此目的,我无法移动到基于单元格的表视图.我知道在拖动完成后,为放置的项目设置间隙动画的简单内置功能.我正在寻找一种在拖拽进行过程中打开间隙的方法.此外,这是一个应用程序在Mac App Store中出售,因此它不能使用私有API.
编辑:我刚刚向Apple提交了一个增强请求,要求内置支持此行为:http://openradar.appspot.com/12662624.Dupe,如果你也想看到它.更新:我请求的增强功能是在OS X 10.9 Mavericks中实现的,现在可以使用NSTableView API实现此行为.请参阅NSTableViewDraggingDestinationFeedbackStyleGap.
cocoa ×10
nstableview ×10
objective-c ×7
macos ×2
double-click ×1
mousedown ×1
nsscrollview ×1
nstextfield ×1
osx-lion ×1
xcode4 ×1