2017-10-15 89 views
0

我是初級MacOS開發者。 在Swift 4可可我想有文本字段與「特殊」處理的Shift鍵。按下shift鍵時強制小寫

默認情況下,如果輸入一個字母,它應該是大寫,但如果按下Shift鍵,字母應該是小寫。

例:

  • 「a」被輸入 - >變換爲「A」
  • 移+」 A」輸入被 - >轉化的‘一’
  • 任何其他條目(編號等)應normally-

我能夠強行與爲大寫處理

override func controlTextDidChange(_ obj: Notification) { 
    print("Text changed") 

    var infoDictionary:Dictionary = obj.userInfo! as Dictionary 
    let text:NSText = infoDictionary["NSFieldEditor"] as! NSText 
    text.string = text.string.uppercased() 
} 

但是,我不知道如何按下sh​​ift鍵時「強制」到小寫字母。

我非常感謝您的閱讀和幫助。

回答

0

在輸入階段處理任務,而不是在文本輸入到字段之後。也就是說,在傳入鍵事件被插入到文本字段之前,將它們轉換成大寫字母。

Apple使用現場編輯器設置,該設置可在編輯時有效地用NSTextView取代NSTextField。該過程在Working with the Field Editor解釋的,並且概括性地是:

  • 可以定義的NSTextView它覆蓋keyDown:調用重寫方法([super ...])之前進行所需的修改的字符的情況下的子類。您的覆蓋將通過未修改收到的NSEvent或構建一個新的與您的案例修改。

  • 窗口包含您的文本字段負責設置字段編輯器。在你的窗口委託你實現委託方法windowWillReturnFieldEditor:toObject:。如果此方法的第二個參數是您希望進行特殊處理的文本字段,則返回NSTextView子類的一個實例,其fieldEditor屬性設置爲YES。否則,您將返回nil

  • 識別需要特殊處理的文本字段的簡單方法是聲明NSTextField的空子類並將其用於特殊文本字段。你的窗口委託方法現在可以做一個類型測試。

如果你有工作出解決問題提出一個新問題呈現你所開發的代碼,解釋你的問題,等有人無疑會幫助你進行下一步。

HTH

+0

子類化'NSTextField'不起作用,字段編輯器處理關鍵事件。重寫'keyDown(with:)'不適用於ü和é。 – Willeke

+0

@Willeke - 雞蛋在臉上,感謝您的發現。修正了覆蓋正確的'keyDown:'的答案。 – CRD

+0

'NSTextView'不被字段編輯器取代。 – Willeke

0

擊鍵文本字段被The Field Editor處理。字段編輯器是NSTextViewNSTextView實現NSTextInputClient協議。創建NSTextView的子類並覆蓋insertText(_:replacementRange:)以更改輸入字符串的大小寫。

class MyTextView: NSTextView { 

    override func insertText(_ string: Any, replacementRange: NSRange) { 
     var newString = string 

     if let oldString = string as? String { 
      if (NSApp.currentEvent?.modifierFlags.contains(.shift))! { 
       newString = oldString.lowercased() 
      } 
      else { 
       newString = oldString.uppercased() 
      } 
     } 
     // handle string is a NSAttributedString 

     super.insertText(newString, replacementRange:replacementRange) 
    } 

} 

子類NSTextFieldCell並重寫fieldEditor(for:)返回的NSTextView的子類的實例。

class MyTextFieldCell: NSTextFieldCell { 

    var myFieldEditor:MyTextView? = nil 

    override func fieldEditor(for controlView: NSView) -> NSTextView? { 
     if (myFieldEditor == nil) { 
      myFieldEditor = MyTextView() 
      myFieldEditor?.isFieldEditor = true 
     } 
     return myFieldEditor 
    } 

} 

將文本字段的單元格的類設置爲MyTextFieldCell