这似乎不可能,但也许其他人也有同样的问题.
我是否可以通过编程方式接受自动填充,或以某种方式获取弹出的建议单词?我的问题是我正在捕获返回/退格键击,然后将焦点移动到另一个textview.当输入/退格时,textview将忽略自动建议的单词.似乎只能通过命中空格/点(并返回新行)来接受自动完成.使用此代码:
- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text {
NSRange textViewRange = [textView selectedRange];
// Handle newrow and backspace.
if(([text length] == 0) && (textViewRange.location== 0) && textViewRange.length==0){
// BACKSPACE KEYSTROKE
[delegate doSomethingWhenBackspace];
return NO;
}else if ([text isEqualToString:@"\n"]){
// RETURN KEYSTROKE
[delegate doSomethingWhenReturn];
return NO;
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
我尝试以编程方式在返回键时添加"space",但也忽略了自动完成的单词.
else if ([text isEqualToString:@"\n"]){
// Tryin to accept autocomplete with no result.
textview.text = [textview.text stringByAppendingString:@" "];
// RETURN KEYSTROKE
[delegate doSomethingWhenReturn];
return NO;
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
当我以UITextView编程方式设置我这样:
[self.textView setText:@""];
委托方法textViewDidChange:不会被调用.有没有一种方法可以在不创建UITextView子类的情况下找到它?
我试图有一个类似于iPhone消息的textview,其中textview最初有一个约束(height <= 100)和scrollEnabled = false
这是项目的链接:https: //github.com/akawther/TextView
文本视图的高度根据内容大小增加,如左图所示,直到达到100的高度,然后scrollEnabled设置为true.它完美无缺,直到我点击右下角的"发送"按钮,其中textView应该变为空并返回到原始高度并且scrollEnabled变为false.中间的图像显示了单击按钮时发生的情况.当我开始输入时,文本视图向下移动,就像您在右侧的最后一张图片中看到的那样.我希望能够单击按钮并消除中间图像上显示的行为,我该如何解决这个问题?
import UIKit
class ViewController: UIViewController, UITextViewDelegate {
@IBOutlet weak var bottomConstraint: NSLayoutConstraint!
@IBOutlet weak var messageTextView: UITextView!
@IBOutlet weak var parent: UIView!
let messageTextViewMaxHeight: CGFloat = 100
override func viewDidLoad() {
super.viewDidLoad()
self.messageTextView.delegate = self
}
@IBAction func Reset(sender: AnyObject) {
messageTextView.text = ""
messageTextView.frame.size.height = messageTextView.contentSize.height
messageTextView.scrollEnabled = false
self.parent.layoutIfNeeded()
}
func textViewDidChange(textView: UITextView) {
if textView.frame.size.height >= self.messageTextViewMaxHeight {
textView.scrollEnabled = true
} else {
textView.scrollEnabled = false …Run Code Online (Sandbox Code Playgroud) 如果我使用键盘键入,则textViewDidChange和shouldChangeTextInRange总是被调用。但是,当我以编程方式更改textView时,不会调用委托方法。如何在textView中进行编程更改以触发委托方法?
更新资料
还有其他方法可以以编程方式模拟键盘输入吗?
我有一个UIView包含一个UITextView.该UIView是内部的启动UIViewController.
但当我触摸UITextView盒子时,没有任何反应.键盘既不出现也没有委托方法响应交互.
码:
noteText = [[UITextView alloc]initWithFrame:CGRectMake(0, 0, 700, 240)];
noteText.layer.borderColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.2].CGColor;
noteText.layer.borderWidth = 2;
[noteText setEditable:YES];
noteText.userInteractionEnabled = YES;
noteText.returnKeyType = UIReturnKeyDone;
noteText.font = [UIFont fontWithName:@"Calibri" size:16];
noteText.textColor = [UIColor blackColor];
[self addSubview:noteText];
Run Code Online (Sandbox Code Playgroud)
更新1
我从UIViewController中删除了所有其他视图,并且只在UIViewController中放置了一个UITextView,但仍未做出反应.光标或键盘都不会出现.
我是iOS开发的新手.
我已经像这样编写了头文件
@interface TextView : UITextView <UITextViewDelegate, UIPopoverControllerDelegate>
Run Code Online (Sandbox Code Playgroud)
在TextView.h中.
实现文件代码如下:
- (BOOL)textViewShouldBeginEditing:(TextView *)textView
{
ZWLog(@"called should begin edit");
return YES;
}
- (void)textViewDidBeginEditing:(TextView *)textView
{
ZWLog(@"called did begin edit");
}
- (BOOL)textViewShouldEndEditing:(TextView *)textView
{
ZWLog(@"called should end editing");
return YES;
}
- (void)textViewDidEndEditing:(TextView *)textView
{
ZWLog(@"view did end edit");
return YES;
}
- (BOOL)textView:(TextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
//my own code
return YES;
}
- (void)textViewDidChange:(TextView *)textView
{
//my own code
}
Run Code Online (Sandbox Code Playgroud)
当我开始输入一个角色时UITextView,我得到了回复
textViewShouldBeginEditing.textViewDidBeginEditing …我们知道它UITextView在iOS 7中更强大,但在这里它表现得更加脆弱.在iOS 6中使用中文输入键盘输入"rr"时,以下代码可正常工作,但在iOS 7中崩溃.
- (void)viewDidLoad
{
[super viewDidLoad];
self.tv = [[UITextView alloc] initWithFrame:CGRectMake(0, 100, 320, 100)];
self.tv.backgroundColor = [UIColor yellowColor];
self.tv.textColor = [UIColor blackColor];
self.tv.editable = YES;
self.tv.delegate = self;
[self.view addSubview:self.tv];
}
-(void)textViewDidChange:(UITextView *)textView{
int maxLength = 2;
if (self.tv.text.length > maxLength) {
NSLog(@"self.tv.text :%@",self.tv.text);
NSLog(@"self.tv.text.length :%d",self.tv.text.length);
NSLog(@"maxLength :%d",maxLength);
self.tv.text = [self.tv.text substringToIndex:maxLength];
}
}
Run Code Online (Sandbox Code Playgroud)
日志如下:
2013-11-13 15:48:16.003 Test2[1388:70b] self.tv.text :r?r
2013-11-13 15:48:16.004 Test2[1388:70b] self.tv.text.length :3
2013-11-13 15:48:16.005 Test2[1388:70b] maxLength :2
2013-11-13 15:48:16.032 Test2[1388:70b] *** Terminating …Run Code Online (Sandbox Code Playgroud) 下面的代码将textView的字符串中的"test"更改为红色,但是当调用textViewDidChange时,它还具有将光标移动到文本块末尾的效果(Aka在进行任何文本编辑时非常烦人).
当我在textViewDidChange中设置setAttributedText时,如何防止光标移动?
- (void)textViewDidChange:(UITextView *)textView {
NSString* currentString = self.textView.text;
NSMutableAttributedString* string = [[NSMutableAttributedString alloc]initWithString:currentString];
NSArray *words=[currentString componentsSeparatedByString:@" "];
for (NSString *word in words) {
if ([word isEqualToString:@"test"]) {
// change color
NSRange range=[currentString rangeOfString:word];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
}
}
// assign new color to textView's text
[self.textView setAttributedText:string];
}
Run Code Online (Sandbox Code Playgroud) 上面的文章是论坛上一位网友发现的问题。最近,我也在firebase上发现了类似的崩溃堆栈。我猜也是这个原因造成的,可能是数据越界的问题。你有好的解决办法吗?
Firebase 使堆栈崩溃:
Fatal Exception: NSInternalInconsistencyException
Invalid parameter not satisfying: pos
0
CoreFoundation
__exceptionPreprocess
1
libobjc.A.dylib
objc_exception_throw
2
Foundation
_userInfoForFileAndLine
3
UIKitCore
-[_UITextKitTextPosition compare:]
4
UIKitCore
-[UITextInputController comparePosition:toPosition:]
5
UIKitCore
-[UITextView comparePosition:toPosition:]
6
UIKitCore
-[UITextPasteController _clampRange:]
7
UIKitCore
__87-[UITextPasteController _performPasteOfAttributedString:toRange:forSession:completion:]_block_invoke
8
UIKitCore
__87-[UITextPasteController _performPasteOfAttributedString:toRange:forSession:completion:]_block_invoke.177
9
UIKitCore
-[UITextInputController _pasteAttributedString:toRange:completion:]
10
UIKitCore
-[UITextPasteController _performPasteOfAttributedString:toRange:forSession:completion:]
11
UIKitCore
__49-[UITextPasteController _executePasteForSession:]_block_invoke
12
libdispatch.dylib
_dispatch_call_block_and_release
13
libdispatch.dylib
_dispatch_client_callout
14
libdispatch.dylib
_dispatch_main_queue_callback_4CF
15
CoreFoundation
__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
16
CoreFoundation
__CFRunLoopRun
17
CoreFoundation
CFRunLoopRunSpecific
18
GraphicsServices
GSEventRunModal
19
UIKitCore …Run Code Online (Sandbox Code Playgroud) ios ×9
uitextview ×9
objective-c ×4
iphone ×2
chat ×1
cocoa-touch ×1
ios15 ×1
ios7 ×1
swift ×1
uitextinput ×1