我试图获得与Facebook的新状态字段相同的效果:在用户无法修改或选择的最后一个字符旁边放置一些内容(例如,标签:"与Joh DOE"。)
实现目标的最佳途径是什么?
由于
尼克
答案 0 :(得分:4)
更简单的解决方案是简单地使TextView中的最后n个字符不可编辑。然后让TextView句柄根据需要移动和包装文本。我猜这就是Facebook正在做的事情,最后只是一些归属文本。
在ViewControllers.h中,确保viewController符合UITextViewDelegate,如下所示。
@interface ViewController : UIViewController <UITextViewDelegate>
然后在viewDidLoad:
方法中,将UITextView的委托设置为ViewController。您也可以添加固定文本。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.myTextView.delegate = self;
self.myTextView.text = " posted by Mike";
}
然后,我们将使用shouldChangeCharactersInRange:
方法阻止用户编辑您想要保留的文本。
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
BOOL deleteKeyPressed = ([text length] == 0 && range.length > 0);
if( range.location > (textView.text.length - @" - posted by Mike".length) || (deleteKeyPressed && range.location > (textView.text.length - @" - posted by Mike".length)) )
{
return NO;
}
return YES;
}
我认为这应该让你开始并让你的生活比找到最后一个文本的结尾更容易,然后在最后放置另一个视图,如果没有足够的空间来适应它可能需要包装。
因此,为了防止用户选择&#34;保留&#34;文本,将以下委托方法添加到ViewController的.m:
-(void) textViewDidChangeSelection:(UITextView *)textView
{
if( textView.selectedRange.location > (textView.text.length - @" - posted by Mike".length) )
{
[textView setSelectedRange:NSMakeRange((textView.text.length - @" - posted by Mike".length), 0 )];
}
}
如果用户选择了所有文字,您仍然需要处理,并选择&#34; cut&#34;或者&#34;粘贴&#34;,但这应该只是shouldChangeTextInRange
中的另一个特例。我会让你想出那个 - 不应该很难。当然比尝试在另一个TextView中动态放置,调整和包装TextView要容易得多。