2014-10-10 85 views
10

我使用Xcode 6.0.1为我的iPhone 5(其中包含iOS 8.0.2)创建iOS 8应用程序。我想这样做是为了当用户点击我的UITextView时,所有文本都会被选中,这样他就可以轻松地开始输入和删除那里的内容(但我不希望文本被自动删除,因为用户可能想要保留它或追加到它)。要做到这一点,我有以下代码:UITextView selectAll方法无法按预期方式工作

- (void)textViewDidBeginEditing:(UITextView *)textView { 
    if ([textView hasText]) { 
     NSLog(@"selectedRange before: %d", textView.selectedRange.length); 
     [textView selectAll:self]; 
     NSLog(@"selectedRange after: %d", textView.selectedRange.length); 
    } 
} 

当这个方法被调用,控制台输出是什么,我希望(即selectedRange长度是一样的人物在textView的文字数) 。然而,在UITextView中没有任何显示,并且它没有被选择(即没有选择菜单弹出)。

我在网上看到过类似这样的多个问题,但没有一个提供的解决方案为我工作(其中一些人在没有提供任何解决方案的情况下将它写成了bug)。将发件人ID更改为self以外的内容(例如nil)没有帮助,也没有帮助按照一个人的建议拨打[textView select:self]。我也试过这个代码:

- (void)textViewDidBeginEditing:(UITextView *)textView { 
    if ([textView hasText]) { 
     UITextRange *range = [textView textRangeFromPosition:textView.beginningOfDocument toPosition:textView.endOfDocument]; 
     [textView setSelectedTextRange:range]; 
    } 
} 

但是,它有同样的问题。

有什么建议吗?

+0

奇怪的行为。正如你可以在http://m.youtube.com/watch?v=iPXsVvva97E这个视频中看到的,它应该像这样工作。 – TMob 2014-10-10 20:30:14

+0

正是如此。我也看过那个视频,不知道我做错了什么。 – 2014-10-10 20:54:51

+0

我有同样的问题,你有没有发现任何修复? – 2014-11-28 16:24:41

回答

3

我发现了这个问题,到目前为止最好的解决方法是创建一个自定义UITextView(即创建一个扩展UITextView一个新的类),然后实现selectAll方法是这样的:

- (void)selectAll:(id)sender { 
    [super selectAll:sender]; 
    UITextRange *selectionRange = [self textRangeFromPosition:self.beginningOfDocument toPosition:self.endOfDocument]; 
    [self performSelector:@selector(setSelectedTextRange:) withObject:selectionRange afterDelay:0.0]; 
} 

然后当您使用文本视图,将其类型设置为您的自定义文本视图类型(在您的代码和故事板中)。现在您可以在需要时成功拨打selectAll方法。我想这也应该与UITextField一起工作,但我还没有尝试过。

20

这种解决方案也是一样,不需要继承UITextView,只是把这个功能您的委托:

目标C -

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    [textView selectAll:nil]; 
    }); 
    return YES; 
} 

SWIFT 3 -

func textViewDidBeginEditing(_ textView: UITextView) { 
    DispatchQueue.main.async { 
     textView.selectAll(nil) 
    } 
} 
+4

这个答案是非常荒谬的。它也是100%正确! – 2015-05-21 22:19:12

4

@brentvatne“我的解决方案为我工作。发布Swift语法,以便人们可以在将来复制和粘贴。

func textViewShouldBeginEditing(textView: UITextView) -> Bool { 
    dispatch_async(dispatch_get_main_queue()) { 
     textView.selectAll(nil) 
    } 
    return true 
} 
相关问题