自定义类(委托集)中未调用 textFieldShouldBeginEditing

Posted

技术标签:

【中文标题】自定义类(委托集)中未调用 textFieldShouldBeginEditing【英文标题】:textFieldShouldBeginEditing not being called in custom class (delegate set) 【发布时间】:2012-12-23 14:14:43 【问题描述】:

我有一个这样的自定义类:

@interface formParser : NSObject <UITextFieldDelegate> 
....

在 .m 中,我创建了一个 UITextField 元素,如下所示:

UITextField *ui = [[UITextField alloc] initWithFrame:CGRectMake(left, top, width, height)];
[ui setDelegate:self];
[ui setPlaceholder:[dict_elementInfo objectForKey:@"placeholder"]];
[ui setBorderStyle:UITextBorderStyleLine];
[view addSubview:ui];

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

NSLog(@"should begin");
return NO;

我的问题是 shouldbegin 永远不会被调用。当我在“普通” UIViewController 类上尝试这种技术时,它可以完美运行,但是在我的自定义对象中执行此操作它从未调用过。任何人都可以找出原因吗?

我的自定义类调用如下:

formParser *fParse = [[formParser alloc] init];
UIView *view_formBackground = [fParse viewOfPlist:@"form" initSize:CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height)];
view_formBackground.backgroundColor = [UIColor whiteColor];


//add views to main view
[scrollView addSubview:view_formBackground];
[self.view addSubview:scrollView];

另外,formparser.m 中的 viewofplist 如下:

-(UIView *)viewOfPlist:(NSString *)filename initSize:(CGRect)size

ypos_element_left = 40; ypos_element_right = 40;

view = [[UIView alloc] initWithFrame:size];

//load plist
NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"plist"];
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
rootArray = [dict objectForKey:@"form"];

//loop door alle UI entries in de dict.
for (NSDictionary *dict_UIElement in rootArray)

    NSString *UIType = [dict_UIElement objectForKey:@"type"];
    if ([UIType isEqualToString:@"ui_empty"])       [self handle_uiempty:dict_UIElement];
    if ([UIType isEqualToString:@"ui_multiselect"]) [self handle_uimultiselect:dict_UIElement];
    if ([UIType isEqualToString:@"ui_label"])       [self handle_uilabel:dict_UIElement];
    if ([UIType isEqualToString:@"ui_textfield"])   [self handle_uitextfield:dict_UIElement];
    if ([UIType isEqualToString:@"ui_choicefield"]) [self handle_uichoicefield:dict_UIElement];
    if ([UIType isEqualToString:@"ui_calendar"])    [self handle_uicalendar:dict_UIElement];




return (view);

感谢您的回答!

【问题讨论】:

当你调用[view addSubview:ui];时,view是什么...里面是什么方法? (另外,在没有init 的情况下调用alloc 通常是个坏主意。) "view" 是在我自己的 formparser.m 中的 "viewofPlist" 例程中创建的 uiview。它在上面的例程中作为视图返回...我已将我的 alloc 例程更改为: formParser *fParse = [[formParser alloc] init] 但无济于事...但是感谢您的提示;) 编辑了我的问题,为您提供 formparser.m 中的例程 【参考方案1】:

您的分配是否超出范围并被 ARC 清理?

关于响应者链如何工作的有用链接..

http://developer.apple.com/library/ios/#documentation/general/conceptual/Devpedia-CocoaApp/Responder.html

【讨论】:

感谢您的网址。我已将 formparser 从 NSObject 继承更改为 UIView 并添加了 canBecomeFirstResponder .. 但是它仍然无法正常工作。奇怪的事实:50% 的情况下,控件上的任何事件都会在调试器中触发 EXC_BAD_ACCESS(崩溃) 您的分配是否超出范围并被 ARC 清理? 您可能想要做的不是成为代表,而是可以设置自己的操作和该对象的目标。在 formParser.m .. [ui setAction:@selector(myOwnAction:)]; [ui setTarget:self]; 您对 ARC 的评论让我很开心!我用一个属性(非原子,保留)替换了 var *fParse,一切正常!如果您将评论标记为答案,我可以接受!谢谢!

以上是关于自定义类(委托集)中未调用 textFieldShouldBeginEditing的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionReusableView 中未调用委托

在我的自定义 collectionView 布局中未调用 prepare()

Swift:在自定义视图中未调用 UIButton 触摸事件

在 iOS 11 和 Xcode 9.1 中未调用 CLLocationManager 的 didUpdateLocations 委托 [重复]

Leaflet.js 中未显示自定义 Mapbox 瓦片集

UITextView 类中未调用 UIAlertView 委托方法