Macos 苹果SidebarDemo的奇怪行为
我必须在我的Mac应用程序中添加一个源列表(iTunes)。为此,我尝试了()。它很好用。我在这个演示中添加了一个按钮来演示Macos 苹果SidebarDemo的奇怪行为,macos,cocoa,nsoutlineview,reloaddata,Macos,Cocoa,Nsoutlineview,Reloaddata,我必须在我的Mac应用程序中添加一个源列表(iTunes)。为此,我尝试了()。它很好用。我在这个演示中添加了一个按钮来演示reloadData方法对NSOutlineView的效果。正如您在图中看到的,有一个问题(在左侧,在reloadData调用之前,在右侧,在reloadData调用之后)。徽章消失、图标改变等 有什么问题?我是否应该避免在NSOutlineView上使用reloadData 我使用的是OSX10.8.2、SDK 10.8和Xcode 4.5.2 您可以下载修改后的Side
reloadData
方法对NSOutlineView
的效果。正如您在图中看到的,有一个问题(在左侧,在reloadData
调用之前,在右侧,在reloadData
调用之后)。徽章消失、图标改变等
有什么问题?我是否应该避免在NSOutlineView
上使用reloadData
我使用的是OSX10.8.2、SDK 10.8和Xcode 4.5.2
您可以下载修改后的SidebareDemo项目
谢谢大家!
SidebarDemo示例代码犯了一个错误,即使用同一个对象表示outline视图中的多行。具体而言,数据源使用的基础数据是这样创建的:
_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:
的顺序在初始加载和重新加载期间略有不同
解决方案是使用唯一的对象来表示大纲视图中的每个项目。对SidebarDemo示例最简单的修改就是创建每个NSString值的可变副本,然后将其存储在\u 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"];
在实际代码中,您不太可能会遇到这个问题,因为您的底层数据对象将由模型类的实例组成,而不是仅由字符串文本组成。SidebarDemo示例代码错误地使用同一对象在outline视图中表示多行。具体而言,数据源使用的基础数据是这样创建的:
_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:
的顺序在初始加载和重新加载期间略有不同
解决方案是使用唯一的对象来表示大纲视图中的每个项目。对SidebarDemo示例最简单的修改就是创建每个NSString值的可变副本,然后将其存储在\u 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"];
在实际代码中,您不太可能会遇到这个问题,因为您的底层数据对象将由模型类的实例组成,而不仅仅由字符串文本组成