- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 NSTableView,可以根据行的数据值在不同的单元格 View 中交换。当模型更改时,我重新加载表,表的委托(delegate)将为新数据提供正确的表单元格 View 。
表格的单元格 View 使用自动布局。所有单元格 View 最初都会正常加载。在模型更改后更新表时,根据是调用 reloadData()
还是 reloadData(forRowIndexes:columnIndexes)
,我会得到不同的结果。使用reloadData()
时,单元格 View 被加载并且自动布局工作正常。如果我使用 reloadData(forRowIndexes:columnIndexes),自动布局会产生完全不同的意外结果。
我创建了一个示例项目来演示该问题。 Here是项目设置的图像,包括在表格单元格 View 上设置的约束。有两个行模板,一个具有蓝色 View (偶数行),一个具有绿色(奇数行),应跨越表格宽度(减去一点填充)。 Controller 提供单元 View :
class TableController: NSObject {
@IBOutlet weak var tableView: NSTableView!
var colorData = [1, 0, 1, 0]
@IBAction func swapLine(_ sender: Any) {
colorData[1] = (colorData[1] + 1) % 2
// tableView.reloadData()
tableView.reloadData(forRowIndexes: [1], columnIndexes: [0])
}
}
extension TableController: NSTableViewDataSource {
func numberOfRows(in tableView: NSTableView) -> Int {
return colorData.count
}
}
extension TableController: NSTableViewDelegate {
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let cellId = (colorData[row]) % 2 == 0 ? "EvenCell" : "OddCell"
return tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(cellId), owner: self)
}
}
界面中的按钮仅交换第 1 行的数据并重新加载数据。初始 View 看起来像 this (交替的绿色和蓝色矩形)。如果您使用 reloadData()
,它看起来像 this (第 1 行从蓝色变为绿色)。但是,如果您使用 reloadData(withRowIndexes:columnIndexes:)
,单元格 View 将缩小到 40 点宽,而其他单元格 View 则为 480 点宽。 Here's View 调试器的抓取显示单元格 View 的大小错误,并显示不明确的宽度约束(使用 reloadData()
时不会发生这种情况)。
文档提到行 View 可以与 reloadData(forRowIndexes:columnIndexes:)
一起重用,但不能与 reloadData()
一起使用,我已经验证了这一点。我想行 View 的重用是导致自动布局问题的原因,但我找不到任何联系。在 SO、AppKit 发行说明、WWDC 视频、Google 搜索或我的头撞 table 上什么也没找到。非常感谢您的帮助。
更新:这是 ColorView 的代码:
class ColorView: NSView {
@IBInspectable var intrinsicHeight: CGFloat = 20
@IBInspectable var color: NSColor = NSColor.blue
override var intrinsicContentSize: NSSize {
return NSSize(width: NSView.noIntrinsicMetric, height: intrinsicHeight)
}
override func draw(_ dirtyRect: NSRect) {
color.setFill()
dirtyRect.fill()
}
}
最佳答案
我想我已经成功了。如果我在单元格返回之前调用 layoutSubtreeIfNeeded()
(这样它的所有 subview (如动态文本)都已设置),那么它似乎可以工作。
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
//...
cell.layoutSubtreeIfNeeded()
return cell
}
希望对您有所帮助。
关于macos - NSTableView reloadData(forRowIndexes :columnIndexes:) breaks autolayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51016445/
在 iOS Autolayout 中,我应该添加什么约束来设置与 Superview(在我的例子中是 UIViewController 的 View )成比例的宽度和高度,使用 Autoresizin
我有一个主屏幕,三个按钮垂直对齐。我想在 4"屏幕上采用我的应用程序。所以我想平均调整按钮之间的空间以填满屏幕。看下面的图片:我怎样才能使用 AutoLayout 完成它? 绿色区域保持其大小。 最佳
我在窗口中有一个 View , View 的位置和大小是通过自动布局计算的。该 View 有一个 subview ,一个可拖动的 NSView 子类。通过覆盖 -mouseDown: 和 -mouse
在 Interface builder 中,size classes 的强大功能让您可以安装或卸载约束。在代码中,您可以通过切换 active 属性来做类似的事情。 Interface Builder
我一直在开发具有相当复杂的包含 View Controller 层次结构的企业 iPad 客户端应用程序。我最近不得不在应用程序启动 View (服务器登录 View )中重新设计。我决定借此机会使用
环境: iOS 6/7、Xcode 5 中的自动布局。 我知道要调整 NavBar 以适应状态栏,我将 NavBar 的背景图像设置为 64 位高(引用:WWDC 2013 Video Lecture
我正在尝试创建一个包含一些垂直放置的按钮的 View ,并且我希望在调整窗口大小时按钮之间的间距相等。该 View 的约束(使用视觉格式)是: H:|-0-[button1]-0-| H:|-0-[b
最近在 Xcode 5 中切换到自动布局(并且观看了 WWDC 13 的开发人员视频),我发现除了基于 View 的 NSOutlineView 之外,其他东西都可以很好地工作。 在自动布局之前,这是
这个问题已经有答案了: Seeing black bars at the top and bottom of the iPhone X Simulator (11 个回答) 已关闭 6 年前。 今天,
对于iPhone 6+的风景和肖像,我有不同的尺寸等级。如果我从横向或纵向开始运行,则不会出现任何约束错误。当我从横向或纵向切换时,会遇到约束错误。看来,如果我切换,则会同时获得纵向和横向尺寸类别约束
我遇到了 AutoLayout 的问题,这让我非常头疼。我使用 Autolayout 在 .xib 中设置了 ScrollView 和容器 View 。我需要动态地将 subview 添加到容器 Vi
我正在构建一个通用的工作流客户端应用程序,它应该使用来自多个源的工作流任务,甚至可以在理想情况下稍后添加,而无需更改应用程序代码。这个想法是应用程序将适应数据结构、类型、UI 和操作元素,理想情况下还
我得到了通常的 Unable to simultaneously satisfy constraints. Probably at least one of the constraints in th
我有以下代码,当我的应用程序出现问题时,会显示包含不同消息的警报。该代码多年来一直运行良好,并且存在于我在 App Store 上的大多数应用程序中。 我正在制作一个新应用程序,只是添加了此代码,但是
我在 UIStoryboard 中添加一个 UIView 并将其绑定(bind)到一个名为 testView 的自定义 UIView 类,接下来,我创建一个 UIView 在 require init
该应用程序允许用户发布图像/关注其他人等。 所以它工作正常,但我收到以下警告:(我知道有些与自动布局约束有关,但我如何知道哪个导致了问题?) 2015-07-05 17:19:37.701 Pixym
假设我有一个包含两列对象的 View 。第一列包含标签,第二列包含 slider 。我希望 slider 全部向左对齐。我希望所有标签都相互对齐。诀窍是,如何设置标签和 slider 之间的间距,以便
我有一个 View ,我在自动布局上设置了这个 View 。当我在 4s iphone 中更改按钮框架/位置时,我无法更改它。如何更改ios 4s中的按钮位置注意不更改自动版式属性? 这是我的代码:
我正在尝试为 iPad 和 iPhone 构建一个包含大约 10 个不同文本字段、开关和标签的表单。在这样做时,我想将 AutoLayout 与 UIScrollView 一起使用,以便它可以在 iP
我将尝试描述这个问题——以前从未见过这种行为。 当应用程序在模拟器或实际设备上启动时,我有一个按钮从应用程序屏幕的右侧移动到中间。我希望它始终位于中间(移动到的位置)。 基本上,它从父 View 上的
我是一名优秀的程序员,十分优秀!