gpt4 book ai didi

ios - 打开表情符号键盘时自定义 UITextField 卡住应用程序?

转载 作者:行者123 更新时间:2023-12-01 18:58:52 29 4
gpt4 key购买 nike

这是我遇到过的最奇怪的事情,而且问题在 iPhone 4 和 iPhone 5s 上都是一致的......

我创建了 UITextField 的子类来添加一些自定义功能,并在 Storyboard 中将 UITextField 的自定义类设置为我的自定义类。

太好了,一切都好 - 但是.. 每当我点击打开字段时,我都可以输入正常 - 只要我点击键盘的表情符号地球部分,应用程序就会立即锁定。它没有崩溃,我只是无能为力,打字指示灯停止闪烁,应用程序无限挂起..

所以很奇怪。

这是我创建的自定义类。

标题

#import <UIKit/UIKit.h>

@interface GenericTextField : UITextField <UITextFieldDelegate>

@property id nextField;
@property id nextCallbackTarget;
@property SEL nextCallbackSelector;

@end

执行
#import "GenericTextField.h"

@implementation GenericTextField

- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
[self setup];
}
return self;
}

- (void)setup
{
self.delegate = self;
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if ([self.nextField respondsToSelector:@selector(becomeFirstResponder)]) {
[self.nextField becomeFirstResponder];
} else {
[self resignFirstResponder];
if ([self.nextCallbackTarget respondsToSelector:self.nextCallbackSelector]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self.nextCallbackTarget performSelector:self.nextCallbackSelector];
#pragma clang diagnostic pop
}
}

return NO;
}

@end

这是另一个有趣的部分。如果我注释掉我将委托(delegate)设置为 self 的部分,一切正常。但是,如果我注释掉我的自定义委托(delegate)方法并在 setup 方法中将委托(delegate)设置为 self,我仍然会卡住。这似乎与设置委托(delegate)特别相关?为什么?它是否与从 initWithCoder 将其设置为 self 有关?如果是这样,为什么它只发生在 UITextField 中,而我的其他自定义类都没有像我制作的 UIScrollView 子类那样将委托(delegate)设置为 self ?

最佳答案

好吧,进行了一些搜索,但也许这个答案会帮助任何试图弄清楚的人。

UITextField is unique AFAIK. You can usually use a class as its own delegate with no particular problems. For UITextField you must create an actual delegate (that could, of course, call methods on the UITextField for which it's a delegate. Just be careful to avoid retain loops, even if you're using ARC).



这导致我在我的植入中尝试了一些更新的代码,并创建了一个共享委托(delegate)类来以我能想到的最简单的方式处理委托(delegate)。这是更新的实现。

希望能帮助到你!
#import "GenericTextField.h"

@interface GenericTextFieldDelegate : NSObject <UITextFieldDelegate>
+ (GenericTextFieldDelegate *)sharedDelegate;
@end

@implementation GenericTextFieldDelegate

+ (GenericTextFieldDelegate *)sharedDelegate
{
static GenericTextFieldDelegate *genericTextFieldDelegate;
@synchronized(self) {
if (!genericTextFieldDelegate) {
genericTextFieldDelegate = [[GenericTextFieldDelegate alloc] init];
}
}

return genericTextFieldDelegate;
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
return YES;
}

- (BOOL)textFieldShouldReturn:(GenericTextField *)textField
{
if ([textField.nextField respondsToSelector:@selector(becomeFirstResponder)]) {
[textField.nextField becomeFirstResponder];
} else {
[textField resignFirstResponder];
if ([textField.nextCallbackTarget respondsToSelector:textField.nextCallbackSelector]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[textField.nextCallbackTarget performSelector:textField.nextCallbackSelector];
#pragma clang diagnostic pop
}
}

return NO;
}

@end

@implementation GenericTextField

- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
[self setup];
}
return self;
}

- (void)setup
{
self.delegate = [GenericTextFieldDelegate sharedDelegate];
}

@end

关于ios - 打开表情符号键盘时自定义 UITextField 卡住应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24317328/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com