textFieldShouldReturn - completionHandler 中的某些方法永远不会被调用

Posted

技术标签:

【中文标题】textFieldShouldReturn - completionHandler 中的某些方法永远不会被调用【英文标题】:textFieldShouldReturn - some methods in completionHandler are never called 【发布时间】:2013-11-27 19:50:45 【问题描述】:

我有一个 UITextField,它允许用户为 Facebook 照片输入自定义相册名称。一旦 textFieldShouldReturn,我将 textField.text 发送到 Facebook。调用完成处理程序后,我想更新我的模型并在我的 tableView 中重新加载数据。

我的问题是我的完成处理程序的某些行从未被调用。我用调试器标记了所有行,一旦我逐行执行代码,其中一些行永远不会被调用,尤其是 tableView reload 方法。

我在线程方面做错了吗?为什么我的部分完成处理程序被取消并且从未调用过?

这是我的代码:

-(BOOL)textFieldShouldReturn:(UITextField *)textField 

NSString *newAlbumName;
newAlbumName = textField.text;

NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
[parameters setObject:newAlbumName forKey:@"name"];
[parameters setObject:newAlbumName forKey:@"message"];

FBRequest* request = [FBRequest requestWithGraphpath:@"me/albums" parameters:parameters HTTPMethod:@"POST"];

FBRequestConnection *connection = [[FBRequestConnection alloc] init];
[connection addRequest:request
     completionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
         if (!error) 
             NSDictionary *newAlbum;
             [newAlbum setValue:newAlbumName forKey:@"name"];
             [self.albums addObject:newAlbum];
             NSLog(@"created: %@", [newAlbum objectForKey:@"name"]);
             [self.tableView reloadData];
         
         else 
             NSLog(@"Error: %@", error.userInfo);
         


     ];
[connection start];

[textField resignFirstResponder];
[textField removeFromSuperview];



   return YES;


【问题讨论】:

显然,如果不满足条件,if 语句主体中的代码行将不会被执行。 @jlehr 这不是问题。 if 语句已执行,但只执行了该语句的几行。最后,问题是我如何初始化 NSDictionary。正确的应该是: NSDictionary *newAlbum = [[NSDictionary alloc] initWithObjectsAndKeys:newAlbumName, @"name", nil]; 【参考方案1】:

你不应该直接在你的块中调用 self。它可能会导致一个保留周期。 所以在块声明之前:

__weak typeof(self) weakSelf = self;

并在你的块中使用weakSelf 而不是self。

【讨论】:

OP 的问题与保留周期无关。 谢谢弗兰克。事实证明,问题在于我如何初始化 NSDictionary。这导致我仍然不太理解的奇怪的代码跳过,但这修复了它: NSDictionary *newAlbum = [[NSDictionary alloc] initWithObjectsAndKeys:newAlbumName, @"name", nil]; 无论如何,我认为你的回答很重要,因为我不应该在块中调用 self。 很高兴您找到了解决方案!谢谢【参考方案2】:

我相信这是线程问题。我从未使用过FBRequestConnection 类,但如果它的块在后台线程上执行,您需要像这样在主线程上更新您的 UI:

if (!error) 
    NSDictionary *newAlbum;
    [newAlbum setValue:newAlbumName forKey:@"name"];
    [self.albums addObject:newAlbum];
    NSLog(@"created: %@", [newAlbum objectForKey:@"name"]);
    dispatch_async(dispatch_get_main_queue(),^
        [self.tableView reloadData];
    );

【讨论】:

感谢您的回答。如果在后台线程上执行,我没有考虑过这可能会计时。但是,问题最终是我如何初始化 NSDictionary。正确的方法是: NSDictionary *newAlbum = [[NSDictionary alloc] initWithObjectsAndKeys:newAlbumName, @"name", nil];

以上是关于textFieldShouldReturn - completionHandler 中的某些方法永远不会被调用的主要内容,如果未能解决你的问题,请参考以下文章

textFieldShouldReturn - completionHandler 中的某些方法永远不会被调用

在 iOS 中未调用 textFieldShouldReturn

TextFieldShouldReturn 未被调用

名为“textFieldShouldReturn(textField:)”的方法的返回值有啥区别? [复制]

textFieldShouldReturn未在iOS中调用

UITextField 自定义 InputView - 如何让 textFieldShouldReturn 触发?