- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基于 NSTableView 的简单 View ,其中一列填充有核心数据实体,而行 View 仅包含一个 NSTextField。我只需要第一行不可编辑,并以红色显示。我尝试在 applicationDidFinishLaunching 的某个地方执行此操作:
NSView *myView = [myPlaylistsTableView viewAtColumn:0 row:0 makeIfNecessary:NO];
NSArray *mySubviews = [myView subviews];
NSTextField *myTextField = [mySubviews firstObject];
[myTextField setEditable:NO];
NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSColor redColor],NSForegroundColorAttributeName, nil];
NSAttributedString *myRedAttributedString = [[NSAttributedString alloc] initWithString:@"All Songs" attributes:myDictionary];
[myTextField setAttributedStringValue:myRedAttributedString];
但是一旦在表格中添加了新元素,或者执行了拖动,第一行就会再次变得可编辑。我尝试编写一个值转换器,将 NSTextField 可编辑绑定(bind)绑定(bind)到数组 Controller 选择索引,如果选择索引为 0,则返回“否”,在所有其他情况下返回"is"。对于值绑定(bind)的条件设置可编辑复选框的各种配置,这不起作用。我想 NSTableView 的子类也应该可以解决这个问题,但我在这方面有点迷失。一如既往,我们非常感谢任何帮助。谢谢。
根据@Joshua Nozzi的建议,我正在为 TableView 实现此委托(delegate)方法:
-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
NSView *myView = [tableView makeViewWithIdentifier:[tableColumn identifier] owner:self];
if (tableView == myPlaylistsTableView)
{
if (row == 0)
{
NSArray *mySubviews = [myView subviews];
NSTextField *myTextField = [mySubviews firstObject];
[myTextField setEditable:NO];
NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSColor redColor],NSForegroundColorAttributeName, nil];
NSAttributedString *myBoldAllSongsString = [[NSAttributedString alloc] initWithString:@"All Songs" attributes:myDictionary];
[myTextField setAttributedStringValue:myBoldAllSongsString];
}
}
return myView;
}
但我一定错过了一些东西,因为该方法是为正确的 NSTableView 和 row = 0 调用的,代码被执行,但我仍然没有红色字符串,并且文本字段是可编辑的。
再次感谢您的帮助。
最佳答案
您正在尝试定位单元格 View 并将其设置为“永远”。 NSTableView
并不完全是这样工作的。每次重新加载一行或整个表时,受影响行的 View 都会“刷新”。
自定义它们的适当位置是在 NSTableViewDelegate
协议(protocol)方法 -tableView:viewForTableColumn:row:
中(记住将实现此方法的 Controller 设置为 TableView 的委托(delegate))。
根据OP的更新进行更新
几点:
使用表列的标识符作为单元格 View 的标识符有点奇怪,因为两者可能不同。特别是当同一列中有多种可能的单元格类型时(常见情况)。最好养成为每个单元格 View 使用唯一标识符的做法,并且如果您有多个单元格 View ,则仅使用列标识符来标识该列。
您将 View 设置在 if()
条件之外,以检查哪个表正在询问。如果你只有一张 table ,就不用费心去检查;如果您可能有多个正在使用该 Controller ,请确保与每个表相关的所有内容(包括 -makeViewWithIdentifier:)都位于其相关条件内。返回 myView
相同 - 应该移入您的条件,如果没有表匹配,则最佳实践的最后返回应该为零。
您似乎仅在 row == 0
时才配置单元格 View ,但您未能考虑已被配置为第 0 行单元格但正在被重用于行>0。您可能会在需要大量滚动的大表中看到所有 >0 行的“有趣”行为。
您确定单元格 View 的第一个 subview 是您的 NSTextField
吗?您是否在调试器控制台中看到任何消息(例如“...不响应选择器...
”)?或者,如果您在 [myTextField setEditable:NO]
行上设置断点,那么当调试器暂停时 myTextField
是否为零?这里的最佳实践是使用 IBOutlet
为您想要与之交互的任何 subview 创建您自己的 View 子类,然后以这种方式更新它们。当您编辑单元格 View 时,依赖其 subview 列表会导致困惑和 future 的错误,即使它一开始是有效的。
与 4 相关,如果您需要的只是一个文本字段作为单元格,为什么不使用现有的 NSTableCellView 类(它有自己的 -textField
导出),这样您就可以告诉它myView.textField.attributedStringValue = someAttributedString
?
NSTextField
有单独的方法来设置其字符串值的字体和颜色。为什么不利用这些而不是创建和设置属性字符串?
添加:忘记了您提到的绑定(bind)。即使您正确获取了对文本字段的引用,在此处设置其属性也不会帮助您,因为绑定(bind)可能会覆盖它们。更容易放弃绑定(bind)并与 NSTableViewDelegate
一起实现 NSTableDataSource
协议(protocol),并在数据更改时自行刷新 TableView 。您将为自己省去很多关于 UI 更新时间的头痛和困惑。
基于上述重写的示例:
-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
// Is it the right table view?
if (tableView == myPlaylistsTableView)
{
// Determine properties based on row
BOOL firstRow = (row == 0);
NSFont * font = (firstRow) ? [NSFont systemFontOfSize:[NSFont systemFontSize]] : [NSFont boldSystemFontOfSize:[NSFont systemFontSize]];
NSString * text = (firstRow) ? @"All Songs" : [self.songsList[ row ] songTitle]; // or whatever other row titles will be
NSColor * color = (firstRow) ? [NSColor redColor] : [NSColor labelColor];
// Make an configure a cell view
NSTableCellView * myView = [tableView makeViewWithIdentifier:@"TextCell" owner:nil];
NSTextField * textField = myView.textField;
textField.editable = !firstRow;
textField.stringValue = text;
textField.font = font;
textField.textColor = color;
return myView;
}
return nil;
}
关于objective-c - Cocoa 如何对基于 NSTableView 的 View 中的特定行强制执行特定的编辑行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29928026/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!