2010-08-26 69 views
1

用戶在我的mp3播放器中選擇一首歌曲。他繼續重新命名歌曲(從而突出顯示該歌曲的「名稱」欄)。控制粘貼到NSTableView中的內容

假設他粘貼「The \ nGreat \ nSong」。默認情況下,如果字符串格式化程序不允許換行符(這是我想要的),該應用程序將產生一個嘟嘟聲。

如何在粘貼之前處理字符串?這是我想要的:如果字符串長度小於200個字符,並且如果它包含換行符,則在實際粘貼字符串之前用空格替換換行符。如果它超過200個字符,只需做默認的操作(因爲我不希望用戶在那裏意外粘貼他的博士論文)。

如何做到這一點?

回答

0

原來,編輯我的NSFormatter子類本身可能是最容易的。這裏是我的NSFormatter方法,如果有人有興趣:

- (BOOL)isPartialStringValid:(NSString *)partial 
      newEditingString:(NSString **)newString 
      errorDescription:(NSString **)errorString 
{ 
    *errorString = nil; 
    *newString = nil; 

    if ([partial containsIllegal]) 
    { 
    NSBeep(); 
    return NO; 
    } 
    else if ([partial containsNewline]) 
    { 
    if ([partial length] > 200) 
    { 
     NSBeep(); 
     return NO; 
    } 
    else 
    { 
     *newString = [partial stringByReplacingOccurrencesOfString:@"\n" withString:@" "]; 
     return NO; 
    } 
    } 
    else 
    return YES; 
} 

這兩個的NSString類的方法有很簡單如下:

- (BOOL)containsIllegal 
{ 
    for (int i=0; i<[self length]; i++) 
    { 
    unichar currentChar = [self characterAtIndex:i]; 

    BOOL charIsIllegal = [[NSCharacterSet illegalCharacterSet] characterIsMember:currentChar]; 

    if (charIsIllegal) 
     return YES; 
    } 
    return NO; 
} 

- (BOOL)containsNewline 
{ 
    for (int i=0; i<[self length]; i++) 
    { 
    unichar currentChar = [self characterAtIndex:i]; 

    BOOL charIsNewLine = [[NSCharacterSet newlineCharacterSet] characterIsMember:currentChar]; 

    if (charIsNewLine) 
     return YES; 
    } 
    return NO; 
} 
-1
- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex 

您可以檢查anObject(通常是NSString)價值,決定你應該用新的值或者不同意。

+0

這個方法不起作用,驗證已經發生時,這種方法是被稱爲。在OP的情況下,輸入事先已被拒絕,並且此方法永遠不會被調用。 – 2010-08-30 12:08:11

-2

查找NSPasteBoard獲取被複制的內容。從那裏,做字符串檢查並決定它們是否可以粘貼。

+0

它來自Mac,而不是iPhone。 – beefon 2010-08-27 09:14:17

+0

抱歉,使用NSPasteBoard而不是UIPasteBoard,我編輯了我的答案。 – 2010-08-27 18:42:19

+0

也不會使用這種方法。你想在哪裏截取粘貼動作?粘貼將發生在作爲字段編輯器的NStextView中。你必須改變它的類並攔截粘貼的動作。我覺得這是一個壞主意,打破了模塊化。 – 2010-08-30 12:09:44

0

如果要驗證用戶輸入,則使用一些委託方法。我從來沒有這樣做過,這正是我從頭文件和文檔中知道的。但是,這可能已經幫助你:

看看textShouldEndEditing:方法NSTableView。這個方法在用戶想要完成數據編輯時被調用,就像你的情況一樣。您可以重寫此方法來執行更改。然而,從它所讀取的文檔中,您甚至不需要重寫,只是爲了實現當時正在調用的代理方法control:textShouldEndEditing:

我會選擇後者。執行control:textShouldEndEditing:並查看它是如何被調用的。第一個參數實際上應該是表格視圖,第二個參數是用於編輯的NSTextView。使用editedRoweditedColumn,您可以獲取正在編輯表格視圖的單元格。進行驗證並簡單地更改傳遞的字段編輯器的文本。

+0

我不想驗證用戶何時離開現場編輯器。我想要通過粘貼來驗證。因爲我的格式化程序不會允許換行符首先被粘貼到字段編輯器中。因此,我必須在粘貼之前以某種方式處理文本*。 – Enchilada 2010-09-17 16:51:42

+0

嗯,沒關係。對我來說,現在看起來很明顯,我當然應該在我的NSFormatter子類中進行處理。 – Enchilada 2010-09-17 17:00:17

+0

對,這是另一種方式。笨拙的我沒有這個想法... – 2010-09-17 17:06:24

相關問題