我正在尝试将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:
我尝试启用“启用僵尸对象”,但未提供任何信息。 我也尝试过为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: 我创建了一个产生此错误的独立项目。只需运行该项目,然后点击/取消搜索栏几次。
视频:
Bugreport:rdar://problem/21673802
答案 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";