我有一个基于视图的NSTableView.我将textField其他元素NSTableCellView放在Interface Builder中的autolayout中.如何根据自动布局参数获取单元格的高度?
这个答案是我找到的最接近我要找的东西,但它是为iOS编写的,并且该systemLayoutSizeFittingSize方法不存在NSView.
我在基于视图的表视图中使用常规(非子类)NSTableCellView.它具有初始图像和文本字段视图.我在视图中添加了一个NSStepper.
text字段绑定到tableCellView.objectValue.quantity.步进器的值也绑定到tableCellView.objectValue.quantity.
问题是,在运行应用程序时,当我单击步进器时,它似乎没有获得鼠标事件,箭头也没有突出显示,值不会递增或递减.
如果我设置表视图的双重操作,如果我双击步进器就好像它是透明的一样.
我错过了什么?
谢谢!
NSOutlineView是.的子类NSTableView.目前,NSTableView支持两种实现方式.
要制作OSX 10.8 Finder样式侧栏(具有自动灰色图标样式),需要使用具有源列表高亮样式的基于视图的表视图.
对于NIB,这是典型的工作.没什么难的.(请参阅SidebarDemo)但我想避免任何NIB或Interface Builder.我想纯粹以编程方式制作侧栏.
在这种情况下,我有很大的问题.AFAIK,没有办法为特定细胞提供原型视图.当我打开.xib文件时,我看到<tableColumn>包含<prototypeCellViews>.这指定了将用于列的视图.我找不到如何使用公共API以编程方式设置它.
作为一种解决方法,我尝试使用-[NSTableView makeViewWithIdentifier:owner:]和手动创建单元格-[NSTableView viewAtColumn:row:makeIfNecessary:],但它们都没有返回视图实例.我创建了一个NSTableCellView,但它没有图像视图和文本字段实例.我也尝试设置它们,但字段标记为,assign因此实例立即释放.我试图通过强制保留它来保持它,但它不起作用.NSTableView不管理它们,所以我确信表视图不喜欢我的实现.
我相信有一个属性可以为列设置此原型视图.但我找不到他们.我在哪里可以找到该属性并以NSOutlineView编程方式使用source-list样式进行系统默认设置?
我想用自定义NSTableCellViews创建一个NSTableview.
这就是我现在所拥有的:
这里我以编程方式创建表视图:
NSScrollView *tableContainer = [[NSScrollView alloc]initWithFrame:NSMakeRect(self.window.frame.size.width-TABLEWIDTH, 0, TABLEWIDTH, self.window.frame.size.height)];
NSTableView *tableView = [[NSTableView alloc] initWithFrame:NSMakeRect(self.window.frame.size.width-TABLEWIDTH, 0, TABLEWIDTH, self.window.frame.size.height)];
NSTableColumn *firstColumn = [[[NSTableColumn alloc] initWithIdentifier:@"firstColumn"] autorelease];
[[firstColumn headerCell] setStringValue:@"First Column"];
[tableView addTableColumn:firstColumn];
tableView.dataSource = self;
tableView.delegate = self;
[tableContainer setDocumentView:tableView];
tableContainer.autoresizingMask = NSViewHeightSizable | NSViewMinXMargin;
[self.window.contentView addSubview: tableContainer];
Run Code Online (Sandbox Code Playgroud)
这是委托方法,我想放置我的自定义单元格代码:
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
// In IB the tableColumn has the identifier set to the same string as the …Run Code Online (Sandbox Code Playgroud) 如何添加填充NSTableCellView?
我希望内容的填充量为10px,类似于纯HTML中的内容.(所有面).文本应在中间垂直居中.
目前我正在NSTextFieldCell的子类中执行此操作.但这似乎不正常.
编辑文本时,编辑文本字段不使用textfieldcell中的填充.
图2:


这是我目前的代码,(子类NSTextFieldCell)
- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
NSRect titleRect = [self titleRectForBounds:cellFrame];
NSAttributedString *aTitle = [self attributedStringValue];
if ([aTitle length] > 0) {
[aTitle drawInRect:titleRect];
}
}
- (NSRect)titleRectForBounds:(NSRect)bounds
{
NSRect titleRect = bounds;
titleRect.origin.x += 10;
titleRect.origin.y = 2;
NSAttributedString *title = [self attributedStringValue];
if (title) {
titleRect.size = [title size];
} else {
titleRect.size = NSZeroSize;
}
// We don't want the width of the string going outside the cell's …Run Code Online (Sandbox Code Playgroud) 我有一个基于视图的 NSTableView 和 NSTableCellView 子类,它们具有启用自动换行的多行 NSTextField。现在我希望我的表格根据文本字段内容具有动态行高。自动布局也已启用。
文本字段的约束如图所示:
Tableview heightForRow 方法代码:
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row {
VerseTableCell *cell = [self getTableCellForRow:row];
[cell.txtSuraDetail invalidateIntrinsicContentSize];
[cell invalidateIntrinsicContentSize];
[cell setTranslatesAutoresizingMaskIntoConstraints:YES];
[cell layout];
[cell setNeedsDisplay:YES];
[cell setNeedsUpdateConstraints:YES];
[cell setNeedsLayout:YES];
[cell layoutSubtreeIfNeeded];
NSRect size = cell.txtSuraDetail.frame;
CGFloat height = (size.size.height) + 30;
return height;
}
Run Code Online (Sandbox Code Playgroud)
单元格布局方法:
- (void)layout {
[super layout];
self.txtSuraDetail.preferredMaxLayoutWidth = self.txtSuraDetail.frame.size.width;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了以下链接,但没有任何帮助,文本字段的文本仍在剪切。
我在10.8上运行基于视图的NSTableView时遇到问题(目标是10.7,但我认为这不相关).
我正在使用NSTableView,我通过绑定获取自定义NSTableCellView的内容值.我使用NSTableCellView的obejctValue来获取我的数据.
我在单元格中添加了一个按钮,我希望它在单击时触发一些动作.到目前为止,我只能在自定义NSTableCellView的子类中触发一个动作.
我可以使用链获得这样点击的行:
NSButton *myButton = (NSButton*)sender;
NSTableView *myView = (NSTableView*)myButton.superview.superview.superview;
NSInteger rowClicked = [myView rowForView:myButton.superview];
Run Code Online (Sandbox Code Playgroud)
从那里我不知道如何到达定义了操作的App Delegate或控制器.
当我使用cocoa绑定时,我没有NSTableView上的委托,我可以使用它来触发我的操作.
你知道我怎么能和控制器交谈吗?
提前谢谢了!
我正在使用基于视图的表,我想在单元格视图中为元素创建一个插座.我无法通过连接来获得连接...它总是如此nil.
具体来说,我有一个NSProgressIndicator表格单元格,并希望在代码中操作它.
这是我到目前为止所拥有的:
我创建了一个子类NSTableView,具有相应的outlet属性:
@interface MyTableCellView : NSTableCellView
@property IBOutlet NSProgressIndicator *myProgressIndicator;
@end
@implementation MyTableCellView
-(void)awakeFromNib
{
// _myProgressIndicator is nil!
}
@end
Run Code Online (Sandbox Code Playgroud)
我已经在笔尖中设置了自定义类.通过下拉列表NSTableCellView替换现有MyTableCellView的.
在这一点上,一些观察:
如果我Ctrl+单击并拖动进度指示器以连接此插座,则不会显示.

同样,如果我尝试Ctrl+单击并使用助理编辑器拖动进度指示器,我只能通过绑定连接到属性.它不承认这是一个有效的出路.
然而,这个插座显示在侧栏上,并警告它不存在: 
我知道MyTableCellView正在使用.断点awakeFromNib确认了这一点,并确认了这_myProgressIndicator一点nil.
这是一个沙盒项目,仅比我所描述的要多.
那么,如何从代码中访问此进度指示器?
当我创建一个非故事板OSX应用程序并将对象库中的表视图添加到Interface Builder中的主窗口时,我能够在该表视图中更改NSTableCellView的高度.
这样做会自动更改TableView的行高(即使我运行应用程序时).

但是当我创建一个Storyboard应用程序并按照完全相同的步骤(添加Table View,更改cellView的高度)时,TableView的行高不会改变,导致在运行应用程序时裁剪NSTableCellView.
我知道你可以实现这个heightForRowAtIndexPath方法,但我只是想知道为什么这在使用xib文件时起作用并在使用故事板时停止工作.(我真的觉得以图形方式设计接口比在文本文件中写下任意数字要容易得多.)
这里有什么我想念的吗?使用故事板,最简单的方法是什么?
xcode interface-builder storyboard tableview nstablecellview
我已经和这个问题斗争了一段时间了。我正在开发文件复制管理器模块,到目前为止,除了取消按钮之外,我已经能够使一切正常工作。由于某种原因,当我单击特定行的取消按钮时,按钮操作同时针对多行。

经过几天的研究这个问题后,我能够使用以下命令使对象成功取消该行所代表的操作:
-(IBAction)btnCancelOperationClick:(id)sender {
NSInteger row = [_tableView rowForView:sender];
if (row != -1) {
FileCopyOperation *opr = [_fileCopyOperations objectAtIndex:row];
[opr cancel];
[_fileCopyOperations removeObjectAtIndex:row];
[_tableView removeRowsAtIndexes:[NSIndexSet indexSetWithIndex:row] withAnimation:NSTableViewAnimationEffectFade];
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用,我可以取消操作并相应地更新我的表。其他一切都按预期工作,但我的代码或绑定一定有问题。我从笔尖加载此单元格,然后使用以下方法注册此笔尖:
[_tableView registerNib:[[NSNib alloc]initWithNibNamed:@"FileCopyCell" bundle:nil] forIdentifier:@"FileCopyCell"];
Run Code Online (Sandbox Code Playgroud)
我将 QueueController 设置为文件的所有者,并像这样挂钩所有内容:

如果有人能为我指出正确的方向以使这件事正常工作,我将不胜感激。提前致谢!
编辑以添加更多代码示例。
-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
FileCopyCell *cell = [tableView makeViewWithIdentifier:@"FileCopyCell" owner:self];
FileCopyOperation *opr = [_fileCopyOperations objectAtIndex:row];
[cell.fileName setStringValue:[NSString stringWithFormat:@"Copying \"%@\"",opr.fName]];
[cell.progressBar setDoubleValue:((opr.bWritten.doubleValue / opr.fSize.doubleValue) * 100)];
[cell.totalBytes setStringValue:[NSString stringWithFormat:@"of %@",[NSByteCountFormatter stringFromByteCount:opr.fSize.longLongValue countStyle:NSByteCountFormatterCountStyleFile]]];
[cell.status setStringValue:[NSString stringWithFormat:@"%@",[NSByteCountFormatter stringFromByteCount:opr.bWritten.longLongValue countStyle:NSByteCountFormatterCountStyleFile]]];
[cell.icon …Run Code Online (Sandbox Code Playgroud) nstablecellview ×10
nstableview ×7
cocoa ×5
macos ×4
objective-c ×3
autolayout ×2
xcode ×2
appkit ×1
nsautolayout ×1
storyboard ×1
tableview ×1