首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从iphone的uitextfield中获取选定的文本?

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

Stack Overflow用户
提问于 2011-03-08 16:58:43
回答 4查看 11.9K关注 0票数 19

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

其中有一个接受输入文本字段,我希望用户从文本字段中选择文本的某一部分,我的应用程序将把所选文本转换为语音。

我的问题是如何从文本字段中获取用户选择的文本?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-06 08:23:23

-[UITextField selectedText]

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

代码语言:javascript
复制
NSString *selectedText = [textField textInRange:textField.selectedTextRange];
NSLog(@"selectedText: %@", selectedText);

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

代码语言:javascript
复制
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:]实现中。

代码语言:javascript
复制
// 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);        
}
票数 31
EN

Stack Overflow用户

发布于 2011-03-08 19:53:01

我解决了我的问题,如下所示:

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

代码语言:javascript
复制
- (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
}

就这样!

票数 6
EN

Stack Overflow用户

发布于 2016-06-08 10:46:04

斯威夫特

在Swift中,从UITextField中获取所选文本的过程如下:

代码语言:javascript
复制
if let textRange = myTextField.selectedTextRange {

    let selectedText = myTextField.textInRange(textRange)
    
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5230297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档