在不使用委托方法的情况下检测UITextView和/或UITextField上的SELECTION更改

时间:2014-12-15 09:44:43

标签: ios objective-c uitextfield uitextview

我正在编写一个自定义UITextView,但是使用UITextView内部的委托,它不再可以在其他地方使用(例如:在UIViewController中)。

那么,有没有办法检测用户何时更改文本视图或文本字段中所选文本的范围,因为我需要插入位置。我找不到任何NSNotification做这样的事情:

[[NSNotificationCenter defaultCenter] addObserver:self
     selector:@selector(selectionDidChange:) 
      name: ?? // someNotification
       object:textView];

然后使用选择器

做一些事情
-(void)selectionDidChange:(NSNotification *)notification {
     //do something
}

我得到了提示here,但不知道如何继续。

感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:1)

我认为你必须为自定义TextField制作我们自己的协议。在您的自定义文本字段中,您实现了UItextfieldDelegate协议,并且您已经创建了自己的协议来阻止UIVIewController。

你的.h

中的

@protocol YourCustomTextFieldDelegate <NSObject>

  - (void) userDidChangeRange:(NSRange*) currentRange;

@end
@interface YourCustomTextField : UIView <UITextFieldDelegate> {
  UITextField *_customTextField;
} 

@property(nonatomic, weak) id<YourCustomTextFieldDelegate> delegate
你的.m

中的

- (void)viewDidLoad{
   [super viewDidLoad];
  // Do any additional setup after loading the view.
 //Create your customTextField and add it to the view
 _customTextField.delegate = self;

 }

#pragma mark - UItextField Delegate

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:    (NSRange)range replacementString:(NSString *)string
{
  [self.delegate userDidChangeRange:range]; 
  return YES;
}

编辑:通知帖子 在你的.h

  interface YourCustomTextField : UIView <UITextFieldDelegate> {
    UITextField *_customTextField;
  } 
你的.m

中的

 - (void)viewDidLoad{
   [super viewDidLoad];
   // Do any additional setup after loading the view.
   //Create your customTextField and add it to the view
   _customTextField.delegate = self;
}

#pragma mark - UItextField Delegate

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:       (NSRange)range replacementString:(NSString *)string
{
   [[[NSNotificationCenter defaultCenter] postNotificationName:@"YourNotificationName" object:self userInfo:@{@"range": range, @"textFieldTag" : @"[NSNumber numberWithInt:self.tag]}]; 
  return YES;
} 

用户将使用

收听您的通知
 - (void) viewWillAppear:(BOOL)animated
 {
  [super viewWillAppear:animated];
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rangeDiDChange) name:@"YourNotificationName" object:nil];
}

我建议您在通知中将标记设置为识别文本字段,如果视图控制器中有许多自定义文本字段,则可以识别它。

希望它会有所帮助。

答案 1 :(得分:0)

UITextViewDelegate有这个

from tkinter import *

root = Tk()

def z():
    w = Toplevel()

    bu = Button(w, text = "Click!", font = 'bold')
    bu.pack()

b = Button(root, text = "Click!", command = z)
b.pack()

root.mainloop()

重要的是,即使选择已更改(更改为0),关闭键盘(例如,如果您的工具栏带有完成按钮)也不会触发选择更改方法,因此我建议在结束编辑方法中也将此方法称为好,同时也可以手动将选定范围设置为nil

-(void)textViewDidChangeSelection:(UITextView *)textView {
    //textView.selectedRange
}