Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UISearchController的UISearchBar在激活时会移出屏幕_Ios_Objective C_Uitableview_Uisearchbar_Uisearchcontroller - Fatal编程技术网

Ios UISearchController的UISearchBar在激活时会移出屏幕

Ios UISearchController的UISearchBar在激活时会移出屏幕,ios,objective-c,uitableview,uisearchbar,uisearchcontroller,Ios,Objective C,Uitableview,Uisearchbar,Uisearchcontroller,我需要在上面有一个UISearchBarUITableView(即搜索栏不是表格视图的一部分),我发现当搜索栏被激活时,它会移出屏幕 我做了大量的搜索,但找不到解决方案,存在“搜索栏屏幕外”问题,但他们正在将搜索栏添加到表的标题视图,并调整属性,如definesPresentationContext修复了它 我的视图层次结构: VC的观点 |-俯视图 |-分段控制 |-搜索栏 |-表视图 看起来UISearchController希望搜索栏位于表视图内,并始终移动表视图,以便搜索栏移动到屏幕的最

我需要在上面有一个
UISearchBar
UITableView
(即搜索栏不是表格视图的一部分),我发现当搜索栏被激活时,它会移出屏幕

我做了大量的搜索,但找不到解决方案,存在“搜索栏屏幕外”问题,但他们正在将搜索栏添加到表的标题视图,并调整属性,如
definesPresentationContext
修复了它

我的视图层次结构:

VC的观点 |-俯视图 |-分段控制 |-搜索栏 |-表视图

看起来UISearchController希望搜索栏位于表视图内,并始终移动表视图,以便搜索栏移动到屏幕的最顶部

有人有相同的问题并找到了解决方案吗


非常感谢

我认为在tableView中放置搜索栏不是强制性的。我以前也有过同样的问题。您只需设置适当的自动布局约束即可。将searchView的前导和尾随调整为与tableView的前导和尾随对齐。还可以从约束中释放边距特性。希望这能对您有所帮助。

经过几次尝试,我发现原因是当激活
UISearchBar
时,
UISearchController
会将其从您的视图中删除,并将其放在自己的视图中,以表视图显示结果,因为我对搜索栏使用自动布局,通过删除它,有些限制条件被搞砸了。因此,我的解决方案是不对
UISearchController

更新中的
UISearchBar
使用自动布局 在进一步测试之后,我决定只实现UISearchBar委托,并停止使用UISearchController,因为我只是重用UICollectionView来获得结果。找到了实现搜索栏的方法

边缘情况#1 TLDR

在包含的视图上启用剪辑边界。或者,如果您有一个包含用户生成的内容视图的集合视图单元格,请在该内容视图上启用剪辑边界。

详细信息:

另外一个非常重要的事实是,您可能在容器视图中嵌入了搜索栏。如果容器视图未启用“剪辑到边界”,这可能会导致问题。这是一个问题的其他示例是UICollectionViewCells中用户生成的内容视图。比较UITableViewCell自动生成的内容视图上的设置以观察差异

总结

一个布尔值,用于确定子视图是否仅限于 视图的边界。声明

var clipstobunds:Bool{get set}讨论

将此值设置为true将导致子视图被剪裁到边界上
接受者的声音。如果设置为false,则显示其框架超出范围的子视图 接收器的可见边界不会被剪裁。默认值 这是错误的

Swift 4.x解决方案 在我的例子中,这发生在UICollectionView内部和UIStackView内部。在搜索栏快速帮助中注意到以下信息后,我能够将搜索栏保持在原位

总结

要在界面中安装的搜索栏。声明

var searchBar:UISearchBar{get}讨论

在展示可搜索内容之前,在中安装搜索栏 该属性位于视图控制器界面的某个位置。这个 搜索栏成为搜索内容的起点。 与搜索栏的交互由 UISearchController对象,它通知 每当搜索信息更改时,SearchResultsUpdate属性。 要使用UISearchBar的自定义子类,请使用UISearchController子类 并实现此属性以返回自定义搜索栏

之后,我通过执行以下操作成功解决了问题:

let searchController = UISearchController(searchResultsController: nil)
var searchBar:UISearchBar!
稍后,我将searchController中的搜索栏分配给UIViewController中的搜索栏

顺便说一句,我将我的搜索栏嵌入到一个容器UIView中,该容器UIView中包含了我需要的所有约束条件,以便将其保持在适当的位置

func setupSearchController<T:UIViewController>(delegate vc:T) where T: UISearchResultsUpdating, T:UISearchBarDelegate {
    searchBar = searchController.searchBar //this is the key
    searchController.searchResultsUpdater = vc
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search".localized()
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.delegate = vc
    searchController.searchBar.showsCancelButton = true
    definesPresentationContext = true
    self.searchMenu.addSubview(searchBar) 
    //searchMenu is a constrained UIView in my hierarchy
}
func setupSearchController(委托vc:T),其中T:uisearchresultsupdated,T:UISearchBarDelegate{
searchBar=searchController.searchBar//这是键
searchController.SearchResultsUpdate=vc
searchController.obscuresBackgroundDuringPresentation=false
searchController.searchBar.placeholder=“Search”.localized()
searchController.dimsBackgroundDuringPresentation=false
searchController.searchBar.delegate=vc
searchController.searchBar.ShowScanCellButton=true
DefinePresentationContext=true
self.searchMenu.addSubview(搜索栏)
//searchMenu是我的层次结构中受约束的UIView
}
//Swift 5

//如果您使用的是UISearch控制器,只需将下面的行添加到 viewDidLoad()将修复此问题

override func viewDidLoad() {
     super.viewDidLoad()

     // fixes the search moving to next screen when its active
     self.definesPresentationContext = true
}

感谢您的回答,是的,如果我单独使用
UISearchBar
,根本没有问题,但是如果我使用新的
UISearchController
中的搜索栏,当搜索栏被激活时,它会显示一些奇怪的动画和错误的位置。找到另一个帖子,PO提到“看起来UISearchController的设计师只考虑了搜索栏位于表头时的情况。”然后你做了什么来放置搜索栏?