ios - 将 UISearchBar returnKeyType 更改为 Done 在 iPhone 5 上有效,但在 iPhone 4s 上会使应用程序崩溃

标签 ios iphone uitableview uisearchbar viewdidload

我有一个奇怪的问题。

我有一个 UITableView,顶部嵌入了 UISearchBar。我已在 UITableViewControllerviewDidLoad 中使用以下代码将“returnKeyType”更改为“完成”而不是“搜索”:

[(UITextField *)self.timelineSearchBar setReturnKeyType: UIReturnKeyDone];
[(UITextField *)self.timelineSearchBar setEnablesReturnKeyAutomatically:NO];

该代码非常适合我的 iPhone 5s。但是,如果我插入 iPhone 4s(也运行 iOS 7),它就会在这两条线路上崩溃。我设置了一个异常断点,它引导我到了那个断点,而且确实如此,如果我注释掉这两个断点,它会再次在 4 上运行。

由于对开发相对较新,我如何才能理解/解决导致问题的原因?

我的 4s Storyboard 与 5 Storyboard 相同,并且此 TableView 和 SearchBar 都是在 Storyboard 中创建的。我已经检查过,两者都连接到相同的属性(timelineSearchBar)。

任何想法都会很棒。

最佳答案

如果 timelineSearchBar 确实是 UISearchBar 类型的属性,那么这些调用实际上在两种设备上都会失败。 UISearchBar 不继承自 UITextField,因此不会实现您尝试调用的两个方法。您对 UITextField 的强制转换是不安全的,并且可能是错误的根源。

如果您确实想更改搜索栏的这些属性,您可以浏览 subview ,直到找到实际的 UITextField,然后在其上设置属性。以下方法将从 subview 中查找文本字段:

-(UITextField*)findTextFieldInSubviewsRecursively:(UIView*)view
{
    if([view isKindOfClass:[UITextField class]]){
        return (UITextField*)view;
    }

    for (UIView *subView in view.subviews){
        UITextField* field = [self findTextFieldInSubviewsRecursively:subView];
        if(field != nil){
            return field;
        }
    }

    return nil;
}

然后你只需要设置你的值:

UITextField* searchBarTextField = [self findTextFieldInSubviewsRecursively:self.timelineSearchBar];
// Set your stuff on the text field

但是这种方法可能不推荐,甚至可能不起作用

关于ios - 将 UISearchBar returnKeyType 更改为 Done 在 iPhone 5 上有效,但在 iPhone 4s 上会使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22989161/

相关文章:

ios - UITableViewCell 中的 UIView 动画只工作一次

ios - 将 Collection View 添加到 TableView 之一

ios - 如何以编程方式确定我的应用程序是否在 iphone 模拟器中运行?

iphone - 我在哪里可以获得所有 iOS 元素的列表?

iphone - .plist 文件在 iPhone 应用程序中的保存位置

ios - 拼贴应用程序的自定义 UIView

iphone - 通过UIImageView触摸?

ios - Fabric/Crashlytics 不兼容的 swift 版本

ios - 无法在我的 WKWebView POST 请求上设置 header

ios - 填写表格 View 部分和单元格