Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 苹果SidebarDemo的奇怪行为_Macos_Cocoa_Nsoutlineview_Reloaddata - Fatal编程技术网

Macos 苹果SidebarDemo的奇怪行为

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

我必须在我的Mac应用程序中添加一个源列表(iTunes)。为此,我尝试了()。它很好用。我在这个演示中添加了一个按钮来演示
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"];
在实际代码中,您不太可能会遇到这个问题,因为您的底层数据对象将由模型类的实例组成,而不仅仅由字符串文本组成