4

我正在将一个多年来一直运行良好的现有项目更新到 High Sierra。视图正确加载并看起来像往常一样:

正常(正确)外观

然后,在我打开一个弹出窗口并再次关闭它之后,视图会移动东西,翻转东西,通常看起来很疯狂:

乱码(错误)外观

请注意,信息标题下降到底部,左侧文本项倒序,日期和下拉文本翻转。发生这种情况时,鼠标交互似乎也很混乱。

我不知道从哪里开始解决这个问题,有人有什么想法吗?

这是使用 xcode 9 beta 5 和 High Sierra Beta 6。
更新:这也在 xcode 9 GM 和 High Sierra GM Seed 中

更新

我已经确定当我在该视图所在的 NSTableView 上调用 reloadData 时会发生这种情况。所以现在的问题似乎是如何刷新表数据而不会出现问题。

4

8 回答 8

2

似乎 reloadData 和 reloadDataForRowIndexes:columnIndexes: 都在 High Sierra 中产生了奇怪的行为。我的解决方法如下:

-(void)refreshAllCells {
    NSMutableIndexSet* rowIndexes = [[NSMutableIndexSet alloc] init];
    if (self.myTable.numberOfRows != 0)
        [rowIndexes addIndexesInRange:NSMakeRange(0, (self.myTable.numberOfRows))];
    [self.myTable removeRowsAtIndexes:rowIndexes withAnimation:NO];
    [self.myTable insertRowsAtIndexes:rowIndexes withAnimation:NO];
}

如果有更好的答案,我仍然希望看到它。

于 2017-09-27T16:26:20.433 回答
1

对我来说,在我的子类中添加 WantUpdateLayer 解决了这个问题。

override open var wantsUpdateLayer: Bool { return true }

于 2018-02-14T18:33:26.887 回答
1

在 IB 中,勾选复选框以在 tableView 的视图上使用 CALayers。我为 tableView 视图层次结构中的所有视图打开了它们,所有翻转都停止了!

无法发布图片,因为我没有足够的声誉,但此链接显示 IB 复选框:

界面生成器选项

于 2018-05-15T15:26:48.207 回答
1

我也遇到了这个错误,在实现另一个答案时,我发现了这个错误的真正原因,因为现在引发了一个异常:

就我而言,在仍在执行时再次reloadData被调用。这导致了渲染问题。reloadData

“循环”是作为调用的副作用发生tableView.makeView(withIdentifier: identifier, owner: self)tableView(_:, viewFor:, row:)。再次调用控制器的owner: self原因又触发了. 在我的设置中,我没有(还)为表格单元格使用单独的 XIB,而是使用在表格视图中设置的单元格作为可见的界面生成器。awakeFromNib()reloadData()

因此,解决方案是更改tableView.makeView(withIdentifier: identifier, owner: self)tableView.makeView(withIdentifier: identifier, owner: nil)表格单元格并使用单独的 XIB。

于 2019-08-08T15:57:26.677 回答
0

我在 10.13 中也看到了这一点,当时 10.12 工作得很好。奇怪的是,我能够通过在其中重新添加单元格视图的子视图来解决这个问题[layout]

- (void)layout{
    if([self needsLayout]){
        for(NSView* v in [[self subviews] copy]){
            [self addSubview:v];
        }
    }

    [super layout];
}
于 2017-11-04T23:20:00.047 回答
0

我也经历过这个。进一步的测试显示,在更新 tableview 数据源时正在绘制内容。通过消除虚假更新,我能够消除该问题。

我在 draw 方法中重新加载数据,但是我已将数据更新代码移到该方法之外。不确定这是否有助于 OP,但它对我有用。

于 2017-11-27T21:48:14.020 回答
0

突然间,我收到了几封来自客户的邮件,他们抱怨所有表格文本都被垂直翻转。他们都使用 macOS Mojave。

经过大量黑客攻击,并尝试了上面详述的解决方案(可惜无济于事),我决定禁用 NSTableView 的 autoSave 属性:

//Swift.print("Now setting autosaveName of primaryView to \(self.className).primary")
//primaryTableView.autosaveName = "\(self.className).primary"
//primaryTableView.autosaveTableColumns = true

然后问题立即消失了。但现在我的客户无法再更改和保存列宽和顺序。因此,不要以编程方式使用 tableView.autosaveName = "autosavename"; 我现在在表格视图属性中设置了 autoSave 属性,并在属性检查器中检查了“列信息”(同时显示 xib 文件)。然后它工作得很好..

我使用当前最新版本的 Xcode (10.1 10B61),问题仅在使用 macOS Mojava 10.14.0 - 10.14.2 时出现。高塞拉利昂和塞拉利昂没有遇到任何麻烦。无论我是在 High Sierra 还是 Mojave 编译项目,都没有区别。

所以,我希望这对面临这个奇怪问题的其他人有所帮助。我认为这是 macOS Mojave 中的一个错误。

于 2019-01-22T22:27:14.653 回答
0

有同样的问题,可在 High Sierra 和 Mojave 上重现。问题在于 NSOutlineView autosaveName,其他解决方案没有帮助。但是我需要这个功能。

将添加/重新加载数据移动到“viewDidAppear()”而不是“viewDidLoad()”解决了这个问题。

编辑:仅在以下情况下发生:

  1. 存在自动保存
  2. 在应用排序之前,项目在 viewDidLoad 上加载
  3. 应用排序后重新加载相同的项目列表
  4. 以上所有都发生在 viewDidLoad

如果您尝试访问 tableView.sortingDescriptors(或 NSOutlineView) - 它会自动应用排序。如果它发生在加载数据之前 - 它工作正常。

在 viewDidAppear 上加载数据看起来仍然是一个更好的选择。

于 2020-02-04T12:54:15.270 回答