gpt4 book ai didi

macos - Apple SidebarDemo 的奇怪行为

转载 作者:行者123 更新时间:2023-12-03 17:13:22 27 4
gpt4 key购买 nike

我必须将源列表(类似于 iTunes)添加到我的 Mac 应用程序中。为此,我尝试( SidebarDemo from Apple )。效果很好。我在此演示中添加了一个按钮来演示 reloadData 方法对 NSOutlineView 的效果。正如您在图像中看到的那样,存在问题(左侧为 reloadData 调用之前,右侧为 reloadData 调用之后)。徽章消失、图标改变等。

有什么问题吗?我应该避免在 NSOutlineView 上使用 reloadData 吗?

我使用的是 OS X 10.8.2、SDK 10.8 和 Xcode 4.5.2。

可以下载修改后的SidebareDemo项目here .

谢谢!

Before and after...

最佳答案

SidebarDemo 示例代码错误地使用同一对象来表示大纲 View 中的多行。特别是,数据源使用的底层数据是这样创建的:

_childrenDictionary = [NSMutableDictionary new];
[_childrenDictionary setObject:[NSArray arrayWithObjects:@"ContentView1", @"ContentView2", @"ContentView3", nil] forKey:@"Favorites"];
[_childrenDictionary setObject:[NSArray arrayWithObjects:@"ContentView1", @"ContentView2", @"ContentView3", nil] forKey:@"Content Views"];
[_childrenDictionary setObject:[NSArray arrayWithObjects:@"ContentView2", nil] forKey:@"Mailboxes"];
[_childrenDictionary setObject:[NSArray arrayWithObjects:@"ContentView1", @"ContentView1", @"ContentView1", @"ContentView1", @"ContentView2", nil] forKey:@"A Fourth Group"];

具有相同值的 NSString 文字由编译器确定是唯一的,因此每次出现 @"ContentView1" 都引用内存中的同一对象。这样做的结果是,当 -outlineView:viewForTableColumn:item: 内的代码查找项目的父项以确定要使用哪个图标或未读状态时,-[NSOutlineView ParentForItem:] 只会为所有 @"ContentView1" 项返回一个父项。事实上,它在最初的情况下完全有效,这似乎是实现过程中的一个意外。在初始加载和重新加载期间,对 -outlineView:viewForTableColumn:item: 的调用顺序略有不同。

解决方案是使用唯一的对象来表示大纲 View 中的每个项目。实现此目的的 SidebarDemo 示例最简单的修改是在将每个 NSString 值存储到 _childrenDictionary 之前创建它的可变副本:

_childrenDictionary = [NSMutableDictionary new];
[_childrenDictionary setObject:[NSArray arrayWithObjects:[@"ContentView1" mutableCopy], [@"ContentView2" mutableCopy], [@"ContentView3" mutableCopy], nil] forKey:@"Favorites"];
[_childrenDictionary setObject:[NSArray arrayWithObjects:[@"ContentView1" mutableCopy], [@"ContentView2" mutableCopy], [@"ContentView3" mutableCopy], nil] forKey:@"Content Views"];
[_childrenDictionary setObject:[NSArray arrayWithObjects:[@"ContentView2" mutableCopy], nil] forKey:@"Mailboxes"];
[_childrenDictionary setObject:[NSArray arrayWithObjects:[@"ContentView1" mutableCopy], [@"ContentView1" mutableCopy], [@"ContentView1" mutableCopy], [@"ContentView1" mutableCopy], [@"ContentView2" mutableCopy], nil] forKey:@"A Fourth Group"];

在现实世界的代码中,您不太可能遇到此问题,因为您的基础数据对象将由模型类的实例组成,而不是仅由字符串文字组成。

关于macos - Apple SidebarDemo 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14425936/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com