2010-11-22 69 views
14

當郵件的NSTokenField一所送的這個輸入無效的電子郵件(一混合令牌純字符串值):帶混合標記/字符串輸入的NSTokenField,可能嗎?

alt text

有沒有做到這一點任何推薦的方法是什麼?
NSTokenField是甚麼合適的工具嗎?或者我會濫用它?

在這個特殊的項目,我需要讓用戶輸入一個文件名模式
(還有其他幾個用例雖然),與預定義的令牌支持。

現在我需要輸入到輸入這樣的:

Glue Text %[Tag]Other Glue Text%[Another Tag]More Text 

我想改變這一些像這樣的防呆圖形解決方案: alt text

NSTokenField總是(!)將輸入的文本轉換爲令牌。

要麼我在我的網絡搜索中使用了錯誤的關鍵字,
或者我真的第一個需要這種(混合)行爲?!

我確實通過蘋果的NSTokenField指南閱讀,但無法找到任何有關我的問題的信息。

回答

12

您需要實施代理方法tokenField:styleForRepresentedObject:才能爲標記返回NSRoundedTokenStyle或爲其他文本返回NSPlainTextTokenStyle。標記的表示對象是標記字符串本身,除非您的委託返回其他對象。

這應該做的伎倆爲您的情況:

- (NSTokenStyle)tokenField:(NSTokenField *)tokenField 
styleForRepresentedObject:(id)representedObject 
{ 
    if ([representedObject rangeOfString: @"%["].location == 0) { 
     return NSRoundedTokenStyle; 
    } else { 
     return NSPlainTextTokenStyle; 
    } 
} 
+0

謝謝,就是這樣! – Regexident 2010-11-23 14:32:00

2

其實,你首先要確定一個符號化人物,而你的情況是%

[tokenField setTokenizingCharacterSet:[NSCharacterSet characterSetWithCharactersInString:@"%%"]]; 

輸入字符串需要改好了到:

膠文本%[標籤]%其他膠水 文本%[另一標籤]%其他文本

......這樣Cocoa知道令牌的結束位置。

如果你想[標籤]在令牌字段顯示爲標籤,你也需要實現tokenField:displayStringForRepresentedObject:方法:或者,如果你只複製:

- (NSTokenStyle)tokenField:(NSTokenField *)tokenField 
displayStringForRepresentedObject:(id)representedObject 
{ 
    if ([representedObject rangeOfString: @"["].location == 0) { 
     return [(NSString*)representedObject substringWithRange:NSMakeRange(1, [(NSString*)representedObject length]-2)]; 

    return representedObject; 
} 

但是,這有一個很大的缺點移動令牌,Cocoa將調用tokenField:displayStringForRepresentedObject:,複製/移動的令牌將更改爲常規文本標記,而不是令牌[Tag]。

如果有人解決了上述問題,我很樂意閱讀。

+0

您需要實現委託方法 - (BOOL)tokenField:(NSTokenField *)tokenField writeRepresentedObjects:(NSArray *)objects toPasteboard:(NSPasteboard *)pboard – Pol 2014-02-18 23:35:23