我有由我的UINavigatableTextField构成的字符框。在每次输入之后,响应者角色应该成功继承它。奇怪的是,在输入第一个字符时,如果用户每次输入字符'Q',则会出现不同的异常;
被抛出。我的代码接收下面的例外,[next nextFirstResponder]行
- (void) moveToNextCharacter: (MBNavigatableTextField *) character
{
dispatch_async(dispatch_get_current_queue(),
^{
UIControl *next = [character nextField];
if(next == nil)
{
[character endEditing:YES];
}
else if ([next isKindOfClass:[UIButton class]])
{
[next sendActionsForControlEvents: UIControlEventTouchUpInside];
}
else
{
[next becomeFirstResponder];
}
});
}
我该如何解决这个问题?提前谢谢。
编辑1:找到一个僵尸[下一个resignFirstResponder](感谢@PhillipMills)
编辑2:事实证明我的问题是由
引起的- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// Something done here...
// code block of evil zombie summoner
[textField setText:@"Some text"];
// Something else done here
}
Profile-> Instruments-> Zombies声明在setText期间:某个对象被释放(我猜是以前的字符串)。
我仍然无法解决问题。我的目标是使用新的用户输入(replacementString:)更新上面的textField。
答案 0 :(得分:0)
必须在主队列上完成对UIKit对象的所有消息传递。虽然情况可能如此,但声明如下:
dispatch_async(dispatch_get_current_queue()
很麻烦,因为我们不知道你收到消息的队列。将其更改为:
dispatch_async(dispatch_get_main_queue()
所以它绝对清楚。
另外,在这一行下:
UIControl *next = [character nextField];
添加以下声明:
NSLog(@"Character CLASS %@", NSStringFromClass[character class]);
NSLog(@"next CLASS %@", NSStringFromClass[next class]);
确保这些是您认为应该的。
编辑:关于“unsafe_unretained”的使用:如果IBOutlet包含在“self.view”中 - 这是主要视图 - 那么你应该在iOS上使用弱 - 所以当你视图消失了。
关于'shouldChangeCharactersInRange',如果只是查看字符,则返回YES。如果您更改文本本身 - 通过直接写入字段/视图,然后返回NO。如果您修改文本然后返回YES,那么您实际上是在改变控件背后的数据,谁知道后果。