你应该使用 self.searchController.searchBar.removeFromSuperview() 而不是:
navigationController?.dismissViewControllerAnimated(true, completion: nil)`
关闭视图。另外,你应该给你的 segue 一个标识符并在prepareForSegue 中检查它。您的实现可能如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ToDetail" {
let destination = segue.destinationViewController as! DetailViewController
navigationController?.dismissViewControllerAnimated(true, completion: nil)
//Pass Info to Detail View
}
}
然后在didSelectRowAtIndexPath 中使用performSegueWithIdentifier 执行你的segue。
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("ToDetail", sender: self)
}
要让 searchBar 重新出现,您可以在主视图控制器上设置一个名为 searchBarShouldBeOpen 的布尔变量。在您的SearchAction 函数中将此值设置为true,然后在viewWillAppear 中使用带有searchBarShouldBeOpen 的if 语句来决定是否运行SearchAction。此外,考虑将SearchAction 设为常规函数,并将除示例中显示的最后一行之外的所有内容移至viewDidLoad。最后,为您的主视图控制器实现UISearchBarDelegate 并覆盖searchBarCancelButtonClicked 并在其中将searchBarShouldBeOpen 设置为false。你的主视图控制器看起来像这样:
class ViewController: UIViewController {
//...Your Variables
var searchBarShouldBeOpen: Bool = false
let searchBarKey = "SearchBarText"
override func viewDidLoad() {
super.viewDidLoad()
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
searchController.searchBar.delegate = self
searchController.hidesNavigationBarDuringPresentation = false
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Search", style: .Plain, target: self, action: #selector(ViewController.showSearchBar))
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if searchBarShouldBeOpen {
navigationController?.presentViewController(searchController, animated: false, completion: nil)
searchBarShouldBeOpen = true
if let previousText = NSUserDefaults.standardUserDefaults().stringForKey(searchBarKey) {
searchController.searchBar.text = previousText
}
}
}
func showSearchBar() {
navigationController?.presentViewController(searchController, animated: true, completion: nil)
searchBarShouldBeOpen = true
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ToDetail" {
let destination = segue.destinationViewController as! DetailViewController
if searchController.searchBar.text != "" {
NSUserDefaults.standardUserDefaults().setValue(searchController.searchBar.text, forKey: searchBarKey)
}
//Pass Info
}
}
//Your functions...
}
extension ViewController: UISearchBarDelegate {
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
searchBarShouldBeOpen = false
}
}
在您的详细视图控制器中添加:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
编辑:
将viewWillAppear 更改为手动呈现不带动画的UISearchBar,而不是使用showSearchBar,这样它就不会每次都动画了。
添加了对super.viewWillAppear(animated)的缺失调用
将 UISearchBar 的解除移至详细视图控制器的 viewWillAppear,因此搜索不会在 segue 之前消失。
使用 NSUserDefaults(在 prepareForSegue 中)保留 UISearchBar 的文本,以便可以将其加载到主视图控制器的 viewWillAppear 中,以将搜索设置为以前的状态.
添加了searchBarKey 常量以用作UISearchBar 文本持久性的键,因此不会使用“魔术字符串”来设置和访问保存的文本。
注意:您真的应该考虑使用didSelectRowAtIndexPath 来执行转场。
其他选项:如果您希望 UISearchBar 在主视图控制器过渡到详细视图控制器的同时进行动画处理,您可以使用自定义 segue(这将使动画平滑一点)。我制作了一个自定义 segue 示例来创建这种效果。请注意,您必须将 Interface Builder 中的视图控制器之间的 segue 更改为具有“自定义”类型并成为 UIStoryboardSegue 的以下子类。
class CustomSegue: UIStoryboardSegue {
override func perform() {
let pushOperation = NSBlockOperation()
pushOperation.addExecutionBlock {
self.sourceViewController.navigationController?.pushViewController(self.destinationViewController, animated: true)
}
pushOperation.addExecutionBlock {
self.sourceViewController.navigationController?.dismissViewControllerAnimated(true, completion: nil)
}
pushOperation.queuePriority = .Normal
pushOperation.qualityOfService = .UserInitiated
let operationQueue = NSOperationQueue.mainQueue()
operationQueue.addOperation(pushOperation)
}
}
您可以在以下链接中阅读有关自定义 segue 中代码的更多信息:
- 自定义转场:http://www.appcoda.com/custom-segue-animations/
- NSOperation:http://nshipster.com/nsoperation/
希望这会有所帮助!如果您需要详细说明,请询问! :)