EXC_BAD_ACCESS三次点击uisearchbar

时间:2015-06-28 10:37:17

标签: ios swift exc-bad-access uiresponder

我正在尝试将UICollectionView中的搜索栏实现为UICollectionViewReusableView

这样我就不使用UISearchController但我正在更改collectionview的数据源

在我的自定义布局中,我以这种方式添加搜索栏:

$('#dataTables-example').DataTable({
  "ajax": "search_autocomplete.php"
});

我正在设置这样的委托:

override func prepareLayout() {
    super.prepareLayout()
    var searchBarAttributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: TeacherSearchbarIdentifier, withIndexPath: NSIndexPath(forItem: 0, inSection: 0))
    searchBarAttributes.frame = CGRectMake(0, 0, collectionViewContentSize().width, 44)
    searchBarAttributes.zIndex = 100
    miscAttributes.append(searchBarAttributes)
}

override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? {
    var attributes = [UICollectionViewLayoutAttributes]()
    for (idx, attr) in enumerate(miscAttributes) {
        if CGRectIntersection(rect, attr.frame) != CGRectNull {
            attributes.append(attr)
        }
    }

    return attributes
}

变量func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { var view = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: kind, forIndexPath: indexPath) as! UICollectionReusableView if kind == TeacherSearchbarIdentifier { controller.searchBar = (view as! TeacherSearchView).searchBar return view } } 是实现controller协议的UICollectionViewController

委托在searchBar变量的didSet中设置。这些是我的代表:

UISearchBarDelegate

现在我的问题了!

当我点击搜索栏时,会出现键盘。如果我按下取消按钮或滚动,它会消失。正如我想要的那样。这也是第二次。

BUT!

如果我第三次这样做,我会得到一个EXC_BAD_ACCESS:

EXC_BAD_ACCESS (code=1, address=0x14ac0beb8)

我尝试启用“启用僵尸对象”,但未提供任何信息。 我也尝试过为Zombie Objects进行分析,它只是在没有任何明显信息的情况下崩溃。

请帮我解决此错误,或者给我进一步的调试说明。

编辑1:

以下是lldb调试器中override func scrollViewDidScroll(scrollView: UIScrollView) { self.view.endEditing(true) } func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool { searchBar.setShowsCancelButton(true, animated: true) return true } func searchBarShouldEndEditing(searchBar: UISearchBar) -> Bool { searchBar.setShowsCancelButton(false, animated: true) searchBar.resignFirstResponder() return true } func searchBarCancelButtonClicked(searchBar: UISearchBar) { searchBar.setShowsCancelButton(false, animated: true) searchBar.resignFirstResponder() } 的输出:

bt all

编辑2: 我创建了一个产生此错误的独立项目。只需运行该项目,然后点击/取消搜索栏几次。

Download Project

视频:

Short gif showing crash

Bugreport:rdar://problem/21673802

2 个答案:

答案 0 :(得分:1)

我向苹果提交了一份错误报告,他们说:

  

Apple开发者关系

     

感谢您的更新。升级是当时的解决方案。

     

我们正在关闭此错误报告。

     

如果您对此问题的解决方案有疑问,请   使用该信息更新您的错误报告。

     

请务必定期检查新的Apple版本是否有任何更新   这可能会影响这个问题。

基本上他们现在不关心这个问题,因为他们即将发布iOS 9

我问为什么正确的方法是保持与iOS 8的兼容性,错误报告仍然是开放的。我们拭目以待吧!

答案 1 :(得分:1)

我在iOS 8中想出了一个解决方法。我发现只有在我的补充视图的kind字符串是Swift字符串时才会发生崩溃。当我使用桥接到Swift的Objective-C字符串时没有崩溃。我尝试了在Swift中明确创建NSString的明显想法,甚至尝试在Swift中创建CFString并将其桥接。但是,这些努力都没有成功。

要轻松验证这一点,请尝试将TeacherSearchbarIdentifier更改为UIKit中的Objective-C字符串,如UICollectionElementKindSectionHeader

更严格的解决方法是为您的用例创建Objective-C字符串并将其暴露给Swift。举个例子:

// MyElementKinds.h

@import Foundation;

FOUNDATION_EXPORT NSString *const TeacherSearchbarIdentifier;
// MyElementKinds.m

#import "MyElementKinds.h"

NSString *const TeacherSearchbarIdentifier = @"TeacherSearchbarIdentifier";