2008-09-10 42 views
5

有沒有方法可以對NSPasteboard進行未經過特別聲明的源應用程序的提供?未過濾NSPasteboard

我試圖在我的應用程序中序列化粘貼板數據。當另一個應用程序將一個RTF文件放在一個粘貼板上,然後我詢問可用的類型時,我得到了11種不同的RTF格式,從原始的RTF到純文本字符串到dyn。*值。

將所有數據保存到磁盤上的plist或原始數據通常不是問題,因爲它非常小,但是如果將任何相當大小的圖像放在粘貼板上,則結果輸出可能會達到幾十倍大於源數據(通過過濾可獲得多種TIFF和PICT數據)。

我想只能儘可能地保存原始應用程序的可用空間。


約翰,你比我自己或我與誰一直在做的Mac編程,因爲恐龍漫遊地球的工作紳士更爲敏銳。我們都沒有注意到你突出顯示的文字......我不知道爲什麼。顯然,問題開始時間過長。

雖然我接受你的答案作爲正確答案,但它並不完全回答我原來的問題。我正在尋找的是一種識別可以成爲其他口味的口味的方法,僅僅通過將它們放置在粘貼板上來知道哪些類型最初由提供者提供。雖然漫步類型列表會讓我獲得提供它們的應用程序的首選順序,但它不會告訴我哪些是我可以放心忽略的,因爲稍後再填充粘貼板時它們將被重新創建。

我得出的結論是,沒有一個「好」的方法來做到這一點。 [NSPasteboard declaredTypesFromOwner]會很棒,但它不存在。

回答

4

-[NSPasteboard types]將返回所有可用的類型剪貼板上的數據,但它應該返回他們"in the order they were declared."

-[NSPasteboard declareTypes:owner:]文檔說"the types should be ordered according to the preference of the source application."

一個正確實施紙板所有者應,因此,申報作爲第一種類型的內容(可能是原始內容)的最豐富的表示;所以合理的單一的表示應該是:

[pb dataForType:[[pb types] objectAtIndex:0]] 
0

您可以得到一些使用了+[NSPasteboard typesFilterableTo:]。我想像這樣一個片段:

NSArray *allTypes = [pb types]; 
NSAssert([allTypes count] > 0, @"expected at least one type"); 

// We always require the first declared type, as a starting point. 
NSMutableSet *requiredTypes = [NSMutableSet setWithObject:[allTypes objectAtIndex:0]]; 

for (NSUInteger index = 1; index < [allTypes count]; index++) { 
    NSString *aType = [allTypes objectAtIndex:index]; 
    NSSet *filtersFrom = [NSSet setWithArray:[NSPasteboard typesFilterableTo:aType]]; 

    // If this type can't be re-created with a filter we already use, add it to the 
    // set of required types. 
    if (![requiredTypes intersectsSet:filtersFrom]) 
     [requiredTypes addObject:aType]; 
} 

但我不知道如何選擇好類型,這將是多麼有效。