iphone touch教學 - 如何以編程方式設置特定UITextField的返回鍵?




cocoa wiki (5)

我不敢相信這個問題還沒有被提出,但我一直無法找到它,所以這是我的假設。

我使用Interface Builder創建了自定義UITableViewCel l子類。 這些都包含UILabelUITextField ,用於我們的登錄屏幕。

在第一個UITextField ,我想讓鍵盤鍵說Next 。 但是,在第二個UITextField ,我希望它說“完成”。

如何以編程方式更改鍵盤上Return Key的值? 我不能使用Interface Builder ,因為這會使兩個鍵顯示為Done

謝謝!


Answers

在swift 4中,以下代碼可用於用“搜索按鈕”或“完成按鈕”替換鍵盤上的“返回按鈕”:

yourTextField.returnKeyType = UIReturnKeyType.search
yourTextField.returnKeyType = UIReturnKeyType.done

它也可以通過在.xib文件中設置屬性來完成。 您只需在Attribute Inspector下將UITextField Return Key屬性設置為Next


你必須調用[textView reloadInputViews]; 設置返回鍵類型後立即更新鍵盤返回鍵的外觀。

做它作為FLLOW:

textView.returnKeyType = UIReturnKeyDone; [textView reloadInputViews];


對於第一個UITextField ,閱讀THIS教程,了解如何在鍵盤上創建按鈕。 您可以從那裡學習邏輯並使用“ Next按鈕而不是“ Done按鈕。

   //if you just want to make it appear NEXT//

    textField.returnKeyType = UIReturnKeyNext;

對於第二個UITextField ,請使用......

   // for DONE //

    textField.returnKeyType = UIReturnKeyDone;

您通常可以創建按鈕並將其重命名為任何內容,並確保在按下該按鈕的事件上給出正確的IBAction 。 如果您確實創建了自己的自定義按鈕,請查看上面的教程,了解如何將其放在正確的坐標和內容中。


雖然UITextField類沒有最大長度屬性,但通過設置文本字段的delegate並實現以下委託方法來獲得此功能相對簡單:

Objective-C的

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }

    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return newLength <= 25;
}

迅速

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let currentCharacterCount = textField.text?.characters.count ?? 0
    if (range.length + range.location > currentCharacterCount){
        return false
    }
    let newLength = currentCharacterCount + string.characters.count - range.length
    return newLength <= 25
}

在文本字段更改之前,UITextField會詢問委託人是否更改指定的文本。 此時文本字段沒有改變,所以我們抓住它的當前長度和我們插入的字符串長度(通過粘貼複製的文本或使用鍵盤輸入單個字符)減去範圍長度。 如果此值太長(本例中超過25個字符),則返回NO以禁止更改。

在文本字段末尾輸入單個字符時, range.location將是當前字段的長度,而range.length將為0,因為我們不替換/刪除任何內容。 插入到文本字段的中間只意味著不同的range.location ,而粘貼多個字符只是表示string有多個字符。

刪除單個字符或剪切多個字符由具有非零長度的range和空字符串指定。 替換只是一個非空字符串的範圍刪除。

關於崩潰“撤消”錯誤的說明

正如在評論中提到的那樣, UITextField有一個可能導致崩潰的錯誤。

如果您粘貼到字段中,但粘貼由驗證實現阻止,則粘貼操作仍會記錄在應用程序的撤消緩衝區中。 如果您隨後觸發撤消操作(通過搖動設備並確認撤消),則UITextField將嘗試用自己的空字符串替換它認為粘貼的字符串。 這將會崩潰,因為它實際上從未將字符串實際粘貼到自身中。 它會嘗試替換不存在的字符串的一部分。

幸運的是,您可以像這樣保護UITextField免於UITextField 。 你只需要確保它想要替換的範圍確實存在於它的當前字符串中。 這是上面最初的完整性檢查。

swift 3.0複製和粘貼工作正常。

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        let str = (textView.text + text)
        if str.characters.count <= 10 {
            return true
        }
        textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
        return false
    }

希望對你有所幫助。





iphone objective-c ios cocoa-touch ipad