如何从iPhone中的uitextfield获取选定的文本?

我正在iPhone上的文本到语音应用程序,

其中有一个文本字段需要input,我希望用户从文本字段中select一些文本的一部分,我的应用程序将把选定的文本转换为语音。

我的问题是如何获得用户从文本字段中select的文本?

-[UITextField selectedText]

虽然UITextField没有selectedText方法,但它符合UITextInput协议 。 因此,您可以使用UITextInput协议所需的属性和方法来确定UITextField *textFieldselectedText (或符合UITextInput协议的任何对象,例如UITextView )。

 NSString *selectedText = [textField textInRange:textField.selectedTextRange]; NSLog(@"selectedText: %@", selectedText); 

另外,还可以使用UITextInput所需的属性和方法来计算UITextField *textFieldselectedRange

 UITextRange *selectedTextRange = textField.selectedTextRange; NSUInteger location = [textField offsetFromPosition:textField.beginningOfDocument toPosition:selectedTextRange.start]; NSUInteger length = [textField offsetFromPosition:selectedTextRange.start toPosition:selectedTextRange.end]; NSRange selectedRange = NSMakeRange(location, length); NSLog(@"selectedRange: %@", NSStringFromRange(selectedRange)); 

-[UITextFieldDelegate textFieldDidChangeSelection:]

虽然, UITextFieldDelegate没有声明一个textFieldDidChangeSelection: delegate方法,就像-[UITextViewDelegate textViewDidChangeSelection:] ,你仍然可以在UITextField的select已经改变的时候进入钩子。 为此,子类UITextField和使用方法swizzling将自己的代码添加到textField.inputDelegate的本地实现-[UITextInputDelegate selectionDidChange:]

 // MyTextField.h #import <UIKit/UIKit.h> @interface MyTextField : UITextField @end // MyTextField.m #import <objc/runtime.h> #import "MyTextField.h" UIKIT_STATIC_INLINE void mySelectionDidChange(id self, SEL _cmd, id<UITextInput> textInput); @implementation MyTextField { BOOL swizzled; } #pragma mark - UIResponder // Swizzle here because self.inputDelegate is set after becomeFirstResponder gets called. - (BOOL)becomeFirstResponder { if ([super becomeFirstResponder]) { [self swizzleSelectionDidChange:YES]; return YES; } else { return NO; } } // Unswizzle here because self.inputDelegate may become the inputDelegate for another UITextField. - (BOOL)resignFirstResponder { if ([super resignFirstResponder]) { [self swizzleSelectionDidChange:NO]; return YES; } else { return NO; } } #pragma mark - Swizzle -[UITextInput selectionDidChange:] // Swizzle selectionDidChange: to "do whatever you want" when the text field's selection has changed. // Only call this method on the main (UI) thread because it may not be thread safe. - (void)swizzleSelectionDidChange:(BOOL)swizzle { if (swizzle == swizzled || ![self respondsToSelector:@selector(inputDelegate)]) return; // 4.3 Class inputDelegateClass = object_getClass(self.inputDelegate); SEL mySelector = @selector(mySelectionDidChange:); class_addMethod(inputDelegateClass, mySelector, (IMP)mySelectionDidChange, "v@:@"); Method myMethod = class_getInstanceMethod(inputDelegateClass, mySelector); Method uiKitMethod = class_getInstanceMethod(inputDelegateClass, @selector(selectionDidChange:)); method_exchangeImplementations(uiKitMethod, myMethod); swizzled = swizzle; // NSLog(@"swizzled? %i", method_getImplementation(uiKitMethod) == (IMP)venmo_selectionDidChange); } @end UIKIT_STATIC_INLINE void mySelectionDidChange(id self, SEL _cmd, id<UITextInput> textInput) { // Call the native implementation of selectionDidChange:. [self performSelector:@selector(mySelectionDidChange:) withObject:textInput]; // "Do whatever you want" with the selectedText below. NSString *selectedText = [textInput textInRange:textInput.selectedTextRange]; NSLog(@"selectedText: %@", selectedText); } 

我解决了我的查询如下:

我实现了UITextView的委托并实现下面的方法

 - (void)textViewDidChangeSelection:(UITextView *)textView { NSRange r = textView.selectedRange; NSLog(@"Start from : %d",r.location); //starting selection in text selection NSLog(@"To : %d",r.length); // end position in text selection NSLog([tv.text substringWithRange:NSMakeRange(r.location, r.length)]); //tv is my text view } 

而已!

迅速

在Swift中,从UITextField获取选定的文本是这样完成的:

 if let textRange = myTextField.selectedTextRange { let selectedText = myTextField.textInRange(textRange) } 

其中textRange是一个用于获取实际选定文本的UITextRange

这里讨论一个类似的话题: 我可以在UITextField中select一个特定的文本块吗?

AFAIK没有事件,如果文本被选中。 但是,您可以设置NSTimer来观看您的文本字段并检查_selectedRange 。 如果发生变化,请启动您的文本到语音代码。

编辑 :我错了select。 UITextField不能做你想做的事情。 但是,如果您使用UITextView ,则可以实现其UITextViewDelegate并重写

 - (void)textViewDidChangeSelection:(UITextView *)textView 

在那里,你可以使用selectedRange属性来获得select。 详情请参阅此参考资料:

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextView_Class/Reference/UITextView.html#//apple_ref/doc/uid/TP40006898-CH3-SW13