簡體   English   中英

UITextFieldDelegate 問題

[英]UITextFieldDelegate problem

我有一個使用 UITextFieldDelegate 協議的 iPad 應用程序。 我聲明並實施了完整的協議。 調用該協議的字段聲明如下:

typingInput = [ [ [ UITextField alloc ] initWithFrame: textIn ] retain ];
dp.x = center.x;
dp.y = center.y - 42;
typingInput.center = dp;

[ self addSubview: typingInput ];
[ typingInput release ];

typingInput.font = [ UIFont systemFontOfSize: 52.0 ];
[ typingInput setTextColor: [ UIColor whiteColor ] ];
typingInput.backgroundColor = [ UIColor colorWithWhite: 0.0 alpha: 0.0 ];
typingInput.alpha = 0.0;
typingInput.userInteractionEnabled = NO;
[ typingInput addTarget: self action: @selector(textField:shouldChangeCharactersInRange:replacementString:) forControlEvents: UIControlEventEditingChanged | UIControlEventAllEditingEvents  ];
typingInput.text = @"";
typingInput.autocorrectionType = UITextAutocorrectionTypeNo;
typingInput.enablesReturnKeyAutomatically = YES;
typingInput.delegate = self;

問題在於

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: (NSRange)qrange replacementString: (NSString *)str;

在模擬器上,“str”的運行時類型是 nil 或 NSCFString,根據這個:

NSLog(@"class = %@, value='%@'", [ str class ], str );

當我編輯字符串時一切正常。

在 iPad 上,相同的日志記錄語句返回:

class = UIFieldEditor, value='<UIFieldEditor: 0xb5f400; frame = (0 0; 640 640); text = 'Foobar'; opaque = NO; layer = <UIWebLayer: 0x113ba0>>'

當我嘗試添加、更改或刪除文本時,隨后將“str”用作 NSString 會導致 iPad 崩潰。 qrange 也是無效的(長度是一個巨大的數字)。

UIFieldEditor 是我沒有使用的 UIWebView.h 的一部分。

在某種程度上改變協議成員的聲明會影響行為。

由於我找不到其他人遇到這個問題,我不得不假設我做錯了什么。

有任何想法嗎?

shouldChangeCharactersInRange委托方法將由 UITextField 自動調用(通過設置其delegate屬性)。 如果您實現了 UITextField 也可以調用其他委托方法。

您沒有(也不應該)使用addTarget將委托方法顯式連接到 UITextField 事件。 這將導致委托方法被調用兩次(一次由協議定義,第二次由您的 addTarget 定義)。

通過(錯誤地)將 UIControl 事件連接到該方法,它被調用的參數與方法的參數不匹配。 UIControl 事件處理方法( shouldChangeCharactersInRange不是)有這些 forms:

- (void)methodName;
- (void)methodName:(id)sender;
- (void)methodName:(id)sender withEvent:(UIEvent *)event;

詳見Cocoa Target-ActioniPhone App Development Lecture 4

刪除 addTarget 行進行修復。


分別地:

  • 不是將 alpha 設置為 0.0 使控件不可見嗎?
  • 為什么 userInteractionEnabled 設置為 NO?
  • 顯式調用retain、調用addSubView、調用release,然后設置屬性(即使它有效)不是通常的做事方式。 去掉retain,把addSubView和release移到最后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM