如何从iPhone中的uitextfield获取选定的文本?
我正在iPhone上的文本到语音应用程序,
其中有一个文本字段需要input,我希望用户从文本字段中select一些文本的一部分,我的应用程序将把选定的文本转换为语音。
我的问题是如何获得用户从文本字段中select的文本?
-[UITextField selectedText]
虽然UITextField
没有selectedText
方法,但它符合UITextInput
协议 。 因此,您可以使用UITextInput
协议所需的属性和方法来确定UITextField *textField
的selectedText
(或符合UITextInput
协议的任何对象,例如UITextView
)。
NSString *selectedText = [textField textInRange:textField.selectedTextRange]; NSLog(@"selectedText: %@", selectedText);
另外,还可以使用UITextInput
所需的属性和方法来计算UITextField *textField
的selectedRange
。
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。 详情请参阅此参考资料: