我正在用iPhone开发文本到语音的应用程序,
其中有一个接受输入文本字段,我希望用户从文本字段中选择文本的某一部分,我的应用程序将把所选文本转换为语音。
我的问题是如何从文本字段中获取用户选择的文本?
发布于 2012-07-06 08:23:23
-[UITextField selectedText]
虽然UITextField
没有selectedText
方法,但它符合UITextInput
protocol。因此,您可以使用UITextInput
协议所需的属性和方法来确定UITextField *textField
(或任何符合UITextInput
协议的对象,如UITextView
)的selectedText
。
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
没有像-[UITextViewDelegate textViewDidChangeSelection:]
那样声明textFieldDidChangeSelection:
委托方法,但是当UITextField
的选择发生变化时,您仍然可以将其挂钩。为此,将UITextField
子类化并使用方法切换将您自己的代码添加到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);
}
发布于 2011-03-08 19:53:01
我解决了我的问题,如下所示:
我实现了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
}
就这样!
发布于 2016-06-08 10:46:04
斯威夫特
在Swift中,从UITextField
中获取所选文本的过程如下:
if let textRange = myTextField.selectedTextRange {
let selectedText = myTextField.textInRange(textRange)
}
其中,textRange
是用于获取实际选定文本的UITextRange
。
https://stackoverflow.com/questions/5230297
复制相似问题