我有创建UISearchController' in my UIVIew'sviewDidLoad`的代码.
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.searchBar.delegate = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.hidesNavigationBarDuringPresentation = false //prevent search bar from moving
controller.searchBar.placeholder = "Search for song"
self.myTableView.tableHeaderView = controller.searchBar
return controller
})()
Run Code Online (Sandbox Code Playgroud)
在此关闭完成后,此警告将出现在控制台中:
Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<UISearchController: 0x154d39700>)
Run Code Online (Sandbox Code Playgroud)
我不知道我做错了什么.这个类似的问题并不是我的情况(至少我不这么认为).到底是怎么回事?
我将UISearchController附加到navigationItem.searchControlleriOS 11上的UITableViewController 的属性.这很好用:我可以使用漂亮的iOS 11风格的搜索栏.
但是,我想在发布时使搜索栏可见.默认情况下,用户必须在表格视图中向上滚动才能看到搜索栏.有谁知道这有可能吗?
左:启动后的默认情况.右:搜索栏可见(通过向上滚动).我希望在发布后可以看到搜索栏,如右侧屏幕截图所示.
我已经发现通过将hidesSearchBarWhenScrolling导航项的属性设置为false 可以使搜索栏可见.但是,这会导致搜索栏始终可见 - 即使向下滚动 - 这也不是我想要的.
这一定是微不足道的,但我找不到你应该如何以编程方式解雇UISearchController?
请注意,它是新的UISearchController(2014年推出iOS 8),而不是UISearchDisplayController.
到目前为止,这就是我所拥有的
// Dismiss the search tableview
searchController.dismissViewControllerAnimated()
// Clear the Search bar text
searchController.active = false
Run Code Online (Sandbox Code Playgroud)
但我仍然有取消按钮,无法摆脱它.
我正在使用UISearchController在tableview的标题视图中显示一个搜索栏:
...
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
Run Code Online (Sandbox Code Playgroud)
(需要设置tableHeaderView属性两次,否则标题视图与第一行重叠,参见SO上的几个答案)
这是它看起来的样子,在不活动时完美地处于适当位置

搜索栏应该在活动时保持原位 - 我不希望它向上移动以隐藏导航栏.但它意外地动画下来,在它和导航栏之间留下一个空白:

这是一个 奇怪的搜索栏动画视频
如果我只是使用与UISearchController分开的搜索栏,则它在激活时不会显示相同的行为.
在我的呈现视图控制器中,我有self.definesPresentationContext = YES;和self.navigationController.navigationBar.translucent = YES;,并且在IB中没有任何"扩展边缘"框是活动的(所有这些似乎都可能使搜索演示文件无法读取).
有谁知道如何阻止搜索栏动画下来?
我之前使用iOS 11之前的代码来自定义UISearchController搜索栏的外观:
var searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.setDefaultSearchBar()
searchController.searchResultsUpdater = self
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
tableView.tableHeaderView = searchController.searchBar
}
extension UISearchBar {
func setDefaultSearchBar() {
self.tintColor = UIColor.blue
self.searchBarStyle = .minimal
self.backgroundImage = UIImage(color: UIColor.clear)
let searchBarTextField = self.value(forKey: "searchField") as! UITextField
searchBarTextField.textColor = UIColor.white
searchBarTextField.tintColor = UIColor.blue
searchBarTextField = .dark
}
}
Run Code Online (Sandbox Code Playgroud)
但是,更新到iOS 11并添加任何自定义的UISearchController一部分(除了键盘外观证明我的代码已被调用)无法显示.这是一个错误还是我错误地实现了它? navigationItem
编辑: 附件是运行iOS 10(第一个)和iOS 11的设备的两个屏幕截图
编辑2:到目前为止,关于这个问题的大部分注意力都集中在文本的颜色上UISearchBar.我在看比这更多-的背景颜色,色调的颜色,搜索指示器和清除按钮颜色等所有不能尽管是完全能够在iOS的10这么做运行iOS 11的设备上进行定制.
结构:
View1(单击按钮) - >以模态方式呈现(MyModalView:UITableViewController)
MyModalView嵌入了UISearchController.UISearchController的searchBar放在MyModalView.tableView.tableHeaderView中.
自iOS 8.0起,它一直运行良好.但是在iOS 9上,当UISearchController处于活动状态时,searchBar会消失.请看下面这些图片
UISearchController在iOS 8上处于活动状态:
UISearchController在iOS 9上处于活动状态:
非常标准的代码:
override func viewDidLoad() {
super.viewDidLoad()
// Dynamically create a search controller using anonymous function
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.searchBar.delegate = self
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
// Auto sizing row & cell height
self.tableView.estimatedRowHeight = 130
self.tableView.rowHeight = UITableViewAutomaticDimension
self.definesPresentationContext = true
// No footer for better presentation
self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}
Run Code Online (Sandbox Code Playgroud)
这个问题也发生在iOS …
我有一个searchBar我在tableviewcontroller中设置.我引用了这个类似的问题UISearchBar在UITableView重新出现之后无法成为第一响应者,但仍然无法将其设置为第一响应者.在.h文件中:
@property (strong, nonatomic) UISearchController *searchController;
@property (strong, nonatomic) IBOutlet UISearchBar *searchBar;
Run Code Online (Sandbox Code Playgroud)
在视图didload中:
self.searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, self.searchController.searchBar.frame.origin.y, self.searchController.searchBar.frame.size.width, 44.0);
self.tableView.tableHeaderView = self.searchController.searchBar;
Run Code Online (Sandbox Code Playgroud)
并在viewDidAppear:
-(void)viewDidAppear:(BOOL)animated {
[self.searchController setActive:YES];
[self.searchController.searchBar becomeFirstResponder];
[super viewDidAppear:animated];
}
Run Code Online (Sandbox Code Playgroud)
当我转向视图时,searchBar会动画,但不会出现键盘.
objective-c uisearchbar first-responder ios uisearchcontroller
我是Swift的新手,我正在尝试为我UITableView的UIViewController类添加搜索功能.我google了很多,发现UISearchDisplayController已被弃用并被UISearchController取代.当我试图搜索教程时,我没有找到任何特别的UITableView.其中一些是为了实施UITableViewController.所以这是我的问题:
我们可以实现UISearchController的UITableView是在一个UIViewController班?(我想我们可以)
如果可以,请转换用Objective-C编写的这些代码行.或者,如果有一些非常好的教程,请告诉我.
@property (strong, nonatomic) UISearchController *searchController;
UITableViewController *searchResultsController = [[UITableViewController alloc] init];
// Init UISearchController with the search results controller
self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController];
// Link the search controller
self.searchController.searchResultsUpdater = self;
Run Code Online (Sandbox Code Playgroud)编辑: 我正在尝试将搜索结果更新程序分配为as
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.blackColor()
self.addTableViewWithSection()
self.searchResultsController = UITableViewController()
var controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = …Run Code Online (Sandbox Code Playgroud) 我想在iOS 8中的UISearchBar中的"取消"按钮的"取消"中更改文本.我正在使用UISearchController.我尝试过iOS 6和iOS 7的不同方法,但它们不起作用.有人这样做过吗?
我有一个导航栏,其中包含一些UIBarButtonItem按钮和类似的UISearchBar挂钩
var searchController: UISearchController!
override func viewDidLoad() {
super.viewDidLoad()
title = "Test"
tableView.delegate = self
tableView.dataSource = self
searchController = UISearchController(searchResultsController: nil)
navigationItem.searchController = searchController
// This leads to the bug
searchController.hidesNavigationBarDuringPresentation = false
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(leftTapped))
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(rightTapped))
}
Run Code Online (Sandbox Code Playgroud)
场景:我点击搜索栏,然后点击取消。
问题1:除非我触摸屏幕的最外面的像素,否则条形按钮对触摸没有反应(仅在模拟器和鼠标单击时才可能)。
问题2:当我按下另一个视图控制器时,导航项重叠。
当我使用hidesNavigationBarDuringPresentation = true它时,它的工作就像预期的那样。
该问题出现在使用Xcode 11.0和11.1的带槽口和非带槽口的iPhone iOS 13.0和13.1上。
这是整个测试项目:https : //github.com/fl034/HidesNavigationBarDuringPresentationTest
我已经提起雷达(您也应该提起诉讼),但是也许你们中的有些人已经找到了解决方法?
更新1:iOS …
ios ×9
swift ×5
uisearchbar ×5
ios8 ×2
uitableview ×2
ios11 ×1
ios13 ×1
ios9 ×1
objective-c ×1