gpt4 book ai didi

ios - UISearchDisplayController 如何窃取 UISearchBar 事件

转载 作者:行者123 更新时间:2023-11-29 02:58:50 24 4
gpt4 key购买 nike

我想实现一个类似 UISearchDisplayController 的 Controller 来显示搜索结果,并添加了一些日志来弄清楚逻辑。

看到日志后,我很好奇UISearchDisplayController是如何窃取UISearchBar事件的。

UISearchDisplayController 在不将 UISearchBarDelegate 设置为自身的情况下工作。而 UISearchBarDelegate 同时在外面工作!

以下是日志:

searchBarShouldBeginEditing:

searchBarTextDidBeginEditing:

searchDisplayControllerWillBeginSearch:

searchDisplayController:didLoadSearchResultsTableView:

searchBar:shouldChangeTextInRange:replacementText:

searchBar:textDidChange:

searchDisplayController:shouldReloadTableForSearchString:

searchDisplayController:willShowSearchResultsTableView:

searchDisplayController:didShowSearchResultsTableView:

searchBarCancelButtonClicked:

searchBarShouldEndEditing:

searchBarTextDidEndEditing:

searchDisplayController:willHideSearchResultsTableView:

searchDisplayController:didHideSearchResultsTableView:

searchBarShouldBeginEditing:

searchBarTextDidBeginEditing:

searchDisplayControllerWillBeginSearch:

searchBar:shouldChangeTextInRange:replacementText:

searchBar:textDidChange:

searchDisplayController:shouldReloadTableForSearchString:

searchDisplayController:willShowSearchResultsTableView:

searchDisplayController:didShowSearchResultsTableView:

searchBar:shouldChangeTextInRange:replacementText:

searchBarSearchButtonClicked:

searchBarShouldEndEditing:

searchBarTextDidEndEditing:

searchBarCancelButtonClicked:

searchDisplayController:willHideSearchResultsTableView:

searchDisplayController:didHideSearchResultsTableView:

最佳答案

好吧,我想通了。

您只需将 UISearchBar 委托(delegate)属性添加到 KVO 观察,然后将您的实现作为委托(delegate)代理即可做到这一点。

示例代码:


    if (searchBar.delegate) {
self.searchBarDelegate = searchBar.delegate;
}

searchBar.delegate = self;

[searchBar addObserver:self forKeyPath:@"delegate" options:NSKeyValueObservingOptionNew context:kSearchBarKVOContext];

#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == kSearchBarKVOContext) {
[self updateSearchBarDelegate];
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}

- (void)updateSearchBarDelegate
{
if (self.searchBar.delegate == self) {
self.searchBarDelegate = nil;
} else {
self.searchBarDelegate = self.searchBar.delegate;
self.searchBar.delegate = self;
}
}

#pragma mark - NSObject Overrides
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
NSMethodSignature *result = [super methodSignatureForSelector:aSelector];

if (!result) {
NSObject *obj = (NSObject *)self.searchBarDelegate;

result = [obj methodSignatureForSelector:aSelector];
}

return result;
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
if ([self.searchBarDelegate respondsToSelector:[anInvocation selector]]) {
[anInvocation invokeWithTarget:self.searchBarDelegate];
} else {
[super forwardInvocation:anInvocation];
}
}

- (BOOL)respondsToSelector:(SEL)aSelector {
return ([super respondsToSelector:aSelector] ||
[self.searchBarDelegate respondsToSelector:aSelector]);
}

关于ios - UISearchDisplayController 如何窃取 UISearchBar 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23531613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com