Skip to content

Rechts ausgerichtete UITextField Leertaste bewegt den Cursor nicht in iOS 7

Es ist wichtig, den Code gut zu verstehen, bevor Sie ihn in Ihrem Projekt verwenden. Wenn Sie etwas beizutragen haben, können Sie dies in den Kommentaren hinterlassen.

Lösung:

Es wäre ein bisschen ein Hack, aber wenn Sie wirklich brauchen, dass die iOS6 Weg aussehen, können Sie Leerzeichen mit nicht-umbrechenden Leerzeichen ersetzen, wie es geschrieben wird. Es wird anders behandelt. Ein Beispielcode könnte so aussehen:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // only when adding on the end of textfield && it's a space
    if (range.location == textField.text.length && [string isEqualToString:@" "]) {
        // ignore replacement string and add your own
        textField.text = [textField.text stringByAppendingString:@"u00a0"];
        return NO;
    }
    // for all other cases, proceed with replacement
    return YES;
}

Falls das nicht klar ist, textField:shouldChangeCharactersInRange:replacementString: ist ein UITextFieldDelegate Protokollmethode, also würde in deinem Beispiel die obige Methode in dem Viewcontroller sein, der durch [textField setDelegate:self].

Wenn Sie Ihre regulären Leerzeichen zurückhaben wollen, müssen Sie natürlich auch daran denken, den Text zurück zu konvertieren, indem Sie die Vorkommen von @"u00a0" durch @" " ersetzen, wenn Sie die Zeichenfolge aus dem Textfeld holen.

Sie müssen die normalen Leerzeichen durch nicht umbrechende Leerzeichen ersetzen. Es ist am besten, eine Aktion auf ein Änderungsereignis für diese auslösen:

  1. Fügen Sie irgendwo eine Aktion für das UIControlEventEditingChanged Ereignis für Ihr Textfeld ein:

    [myTextField addTarget:self action:@selector(replaceNormalSpacesWithNonBreakingSpaces)
                      forControlEvents:UIControlEventEditingChanged];
    
  2. Dann implementieren Sie das replaceNormalSpacesWithNonBreakingSpaces Methode:

    - (void)replaceNormalSpacesWithNonBreakingSpaces
    {
        self.text = [self.text stringByReplacingOccurrencesOfString:@" "
                                                         withString:@"u00a0"];
    }
    

Dies ist sicherer als die Verwendung von textField:shouldChangeCharactersInRange:replacementString:, denn wenn Sie NO zurückgeben, heißt das, dass der angegebene Text nicht geändert werden soll. Dies führt zu Änderungsereignissen (wie die IBActions textFieldEditingChanged: oder die UITextField's UIControlEventEditingChanged Ereignis) nicht ausgelöst werden.

Repariere es überall:

Wenn Sie diese Korrektur für alle Ihre UITextFields wünschen, können Sie eine Kategorie erstellen, in der Sie diese Ereignisaktionen hinzufügen, wenn ein UITextField ausgelöst wird. Im folgenden Beispiel ändere ich auch die nicht umbrechenden Leerzeichen in normale Leerzeichen zurück, wenn die Bearbeitung beendet ist, so dass mögliche Probleme mit den nicht umbrechenden Leerzeichen nicht auftreten, wenn die Daten an anderer Stelle verwendet werden. Beachten Sie, dass in diesem Beispiel die Methode swizzling verwendet wird, so dass es vielleicht etwas seltsam aussieht, aber es ist korrekt.

Die Header-Datei:

//  UITextField+RightAlignedNoSpaceFix.h

#import 

@interface UITextField (RightAlignedNoSpaceFix)
@end

Die Implementierungsdatei:

//  UITextField+RightAlignedNoSpaceFix.m

#import "UITextField+RightAlignedNoSpaceFix.h"

@implementation UITextField (RightAlignedNoSpaceFix)

static NSString *normal_space_string = @" ";
static NSString *non_breaking_space_string = @"u00a0";

+(void)load
{
    [self overrideSelector:@selector(initWithCoder:)
              withSelector:@selector(initWithCoder_override:)];

    [self overrideSelector:@selector(initWithFrame:)
              withSelector:@selector(initWithFrame_override:)];
}

/**
 * Method swizzles the initWithCoder method and adds the space fix
 * actions.
 */
-(instancetype)initWithCoder_override:(NSCoder*)decoder
{
    self = [self initWithCoder_override:decoder];
    [self addSpaceFixActions];
    return self;
}

/**
 * Method swizzles the initWithFrame method and adds the space fix
 * actions.
 */
-(instancetype)initWithFrame_override:(CGRect)frame
{
    self = [self initWithFrame_override:frame];
    [self addSpaceFixActions];
    return self;
}

/**
 * Will add actions on the text field that will replace normal 
 * spaces with non-breaking spaces, and replaces them back after
 * leaving the textfield.
 *
 * On iOS 7 spaces are not shown if they're not followed by another
 * character in a text field where the text is right aligned. When we
 * use non-breaking spaces this issue doesn't occur.
 *
 * While editing, the normal spaces will be replaced with non-breaking
 * spaces. When editing ends, the non-breaking spaces are replaced with
 * normal spaces again, so that possible problems with non-breaking
 * spaces won't occur when the data is used somewhere else.
 */
- (void)addSpaceFixActions
{

    [self addTarget:self action:@selector(replaceNormalSpacesWithNonBreakingSpaces)
               forControlEvents:UIControlEventEditingDidBegin];

    [self addTarget:self action:@selector(replaceNormalSpacesWithNonBreakingSpaces)
               forControlEvents:UIControlEventEditingChanged];

    [self addTarget:self action:@selector(replaceNonBreakingSpacesWithNormalSpaces)
               forControlEvents:UIControlEventEditingDidEnd];

}

/**
 * Will replace normal spaces with non-breaking spaces.
 */
- (void)replaceNormalSpacesWithNonBreakingSpaces
{
    self.text = [self.text stringByReplacingOccurrencesOfString:normal_space_string
                                                     withString:non_breaking_space_string];
}

/**
 * Will replace non-breaking spaces with normal spaces.
 */
- (void)replaceNonBreakingSpacesWithNormalSpaces
{
    self.text = [self.text stringByReplacingOccurrencesOfString:non_breaking_space_string
                                                     withString:normal_space_string];
}

@end

Alle obigen Antworten sind großartig und sehr aufschlussreich! Besonders großen Dank an die Antwort von meaning-matters weiter unten. Hier ist eine getestete Swift 2.0 Version. Erinnern Sie sich an an zuordnen. die Delegierten des UITextFields an Ihren ViewController! Viel Spaß beim Codieren.

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

    if (textField == self.desiredTextField) {
        var oldString = textField.text!
        let newRange = oldString.startIndex.advancedBy(range.location)..

--

Und hier ist Swift 3!

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if (textField == self.textfield) {
        let oldString = textField.text!
        let newStart = oldString.index(oldString.startIndex, offsetBy: range.location)
        let newEnd = oldString.index(oldString.startIndex, offsetBy: range.location + range.length)
        let newString = oldString.replacingCharacters(in: newStart..

Bewertungen und Kommentare

Denken Sie daran, dieses Schreiben sichtbar zu machen, wenn es Ihr Problem gelöst hat.



Nutzen Sie unsere Suchmaschine

Suche
Generic filters

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.