UISearchDisplayController 没有调光?
Posted
技术标签:
【中文标题】UISearchDisplayController 没有调光?【英文标题】:UISearchDisplayController Without Dimming? 【发布时间】:2010-08-20 03:12:34 【问题描述】:我正在编写一个 SplitView iPad 应用程序。在 DetailViewController 内部,有一个包含 UITableView
和 UISearchBar
及其控制器的小视图。此视图并不代表为 DetailViewController 保留的整个屏幕空间。实际上,它只使用了一半。另一半有一个UIImageView
。
这就是麻烦出现的地方:每次我使用搜索栏时,显示控制器(我假设)都会使 DetailViewController 中的所有内容变暗,包括图像视图。这与运行应用程序时的预期不一致。有什么办法可以让框架变暗吗?或者至少永久禁用调光?
提前致谢。
【问题讨论】:
【参考方案1】:您是正确的,是 UISearchDisplayController 正在管理您所看到的“变暗”效果。
UISearchDisplayController 所做的是将 UIControl 作为子视图添加到 searchContentsController(UISearchDisplayController 的属性)的视图中,这可能是您的详细视图控制器。这个 UIControl 只是一个带有灰色背景的 alpha 视图。它似乎有一个内部事件处理程序,当点击时结束搜索。
要将调光效果限制在详细视图的子视图中,您需要做三件事。 (我假设您的详细视图控制器是通过 xib 定义的。如果没有,这些步骤也可以在代码中完成。)
1) 将新的 UIViewController 添加到您的详细视图控制器 xib。将此新视图控制器附加到您的详细视图控制器的 IBOutlet。在我的示例中,我称之为“_searchAreaViewController”。这很重要,即使您永远不会访问视图控制器(但请记住,您必须在某个时候释放它)
@interface DetailViewController : UIViewController <UIPopoverControllerDelegate, UISplitViewControllerDelegate, UITableViewDelegate, UITableViewDataSource>
UIPopoverController *popoverController;
UIToolbar *toolbar;
id detailItem;
UILabel *detailDescriptionLabel;
IBOutlet UIViewController* _searchAreaViewController;
2) 使您的搜索区域的包含视图成为这个新视图控制器的视图。为此,请使用 Interface Builder 为该视图设置一个新的引用插座,方法是将插座拖到 searchAreaViewController 并选择“视图”插座。您必须有一个包含视图 - 它应该是您的详细视图的子视图,并且它应该包含 UISearchBar 并且可能包含您的 UITableView。
3) 使 UISearchDisplayController 的 searchContentsController 属性引用这个新的视图控制器而不是 detail-view-controller。这只能通过 Interface Builder 来完成,因为该属性是只读的(IB 有一些魔法可以让它工作?)如果您需要通过代码执行此步骤,您必须将 UISearchDisplayController 子类化并从 a 返回正确的值“searchContentsController”的属性覆盖。
我制作了一个示例应用程序来演示这一点,我必须添加到 SplitView 模板的唯一代码行是上面第 1 步中列出的代码行。其他一切都只是添加视图/控制器并在 IB 中正确连接它们。
祝你好运!
【讨论】:
在这样做之后,该区域仍然变暗......我唯一的疑问是第 2 步。当将视图链接到视图控制器时,它成为详细视图控制器和 searchAreaViewController 的出口.那是对的吗?如果我删除对详细视图控制器的引用,应用程序会在启动时崩溃。 不,它应该只是新“searchAreaViewController”的视图。该视图需要是 DetailViewController 视图的子视图。这就是你所拥有的吗? 感谢您抽出宝贵时间构建该示例,Tom。现在我做对了。 为什么只有当我为 _searchAreaViewController 添加一个 IBOutlet 时,它才有效?如果我不这样做,搜索结果甚至不会出现。 嗨,TomSwift,您不知道您的示例项目如何帮助我获得适用于 uitable 的 searchdisplaycontroller。万分感谢。我在单个视图控制器中有 2 个 uitableviews,每个视图最终覆盖半个屏幕,我想为其中一个放置 searchdisplaycontroller。我已经尝试了一个月左右,但有些或其他的它对我不起作用。【参考方案2】:ios 8+
[[UIView appearanceWhenContainedInInstancesOfClasses:@[NSClassFromString(@"UISearchDisplayControllerContainerView")]] setHidden:YES];
iOS 7
[View appearanceWhenContainedIn:NSClassFromString(@"UISearchDisplayControllerContainerView"), nil] setHidden:YES];
我知道,UISearchDisplayController 现在已经被弃用了,但是如果你仍然需要使用它,你可以用一行代码完美解决你的问题。将其添加到 viewDidLoad 方法中。
【讨论】:
这个答案似乎没有为问题添加任何重要内容。如果这是讨论其他开发人员需要注意的新变化,因为其他答案已经发布,请在你的答案中充分说明这一点,因为这个问题太老了。更好的是,建议对适当的答案进行修改以更新它。 @Ghedipunk,我认为你错了,这个答案增加了一些重要的东西,因为其他开发人员现在不能像以前那样花太多时间去努力和实施这么多的步骤。附言答案已更新。 然后用两行以上的代码和一段写得不好的段落来解释为什么这会增加一些重要的东西。 答案可能是对的,但没有有帮助。请花几分钟时间编辑此答案,以引导用户了解如何使用这些代码行以及有什么好处。这是一个老问题,因此应特别注意新问题。【参考方案3】:您能否阐明“使用搜索栏”和“使所有内容变暗”的意思?我以这样一种方式解释您所写的内容,即当您要在搜索栏的文本字段中输入文本时,键盘会弹出。并且此时详细视图变暗,阻止了用户交互。
原因是搜索栏实现了一个模式对话框,只要显示键盘,它就会阻止用户与视图交互。不幸的是,似乎没有任何方法可以配置搜索栏来防止这种行为。另一方面,我不确定用户不会期待这种行为,因为搜索栏始终是模态的,并且在 iOS 下通常表现得像这样。
我尝试了两种解决方法:
1.) UIViewController
有一个名为 modalPresentationStyle
的属性,如果它的值为 UIModalPresentationFormSheet
,它会产生您所描述的行为(“所有未覆盖的区域都会变暗以防止用户与它们交互。 ",见Apple documentation)。但是将此属性设置为不同的值不会改变结果(至少对我来说它不起作用)。
2.) 您需要编写自己的非模态搜索栏替换,因为标准 UITextField 是非模态的,因此不会使任何其他 UI 元素变暗。这种方法有效,但您可能需要做更多工作才能使其看起来像“常规”搜索栏。但是,同样,由于此搜索栏的行为与 iOS 中的模态普通搜索栏不同,这可能不是用户所期望的。
【讨论】:
【参考方案4】:我知道我迟到了,这是一个可怕的想法,但 'setHidden:No' 对我不起作用。
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
BOOL hasBeenremoved = NO;
hasBeenremoved = [[[[NSThread mainThread] threadDictionary] objectForKey:@"hasBeenremoved"] boolValue];
if (hasBeenremoved)
UIView* dimmingView = nil;
dimmingView = [[[NSThread mainThread] threadDictionary] objectForKey:@"dimmingView"];
UIView* dimmingViewSuperView = nil;
dimmingViewSuperView = [[[NSThread mainThread] threadDictionary] objectForKey:@"dimmingViewSuperView"];
[dimmingViewSuperView addSubview:dimmingView];
[[[NSThread mainThread] threadDictionary] setObject:@NO forKey:@"hasBeenremoved"];
if ([searchText length] == 0 || [searchText isEqualToString:@""] )
[searchBar becomeFirstResponder];
[[[self primarySearchDisplayController] searchResultsTableView] reloadData];
[[[self primarySearchDisplayController] searchResultsTableView] setHidden:NO];
for( UIView *subview in self.view.subviews )
if([subview isMemberOfClass:[UIControl class]] ||
([[[subview class] description] isEqualToString:@"UISearchDisplayControllerContainerView"]))
for(UIView *subView2 in subview.subviews)
for(UIView *subView3 in subView2.subviews)
if (subView3.alpha < 1)
if ([[[subView3 class] description] isEqualToString:@"_UISearchDisplayControllerDimmingView"])
[[[NSThread mainThread] threadDictionary] setObject:subView3 forKey:@"dimmingView"];
[[[NSThread mainThread] threadDictionary] setObject:subView3.superview forKey:@"dimmingViewSuperView"];
[[[NSThread mainThread] threadDictionary] setObject:@YES forKey:@"hasBeenremoved"];
[subView3 removeFromSuperview];
【讨论】:
以上是关于UISearchDisplayController 没有调光?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 UISearchDisplayController 有时有效,有时无效?
iOS UISearchDisplayController学习笔记
在 UISearchDisplayController 上遇到僵尸问题
修复 UITableView 顶部的 UISearchdisplaycontroller 搜索栏