我已经搜索过该网站,我在这个主题周围找到的唯一线索仍未得到答复,所以我希望我能有更多的运气。
我相对确定我要做的事情相当容易,但我似乎无法找到答案。
我有一个带有Uitext字段的视图控制器,当单击文本字段时,它会以模态方式显示搜索控制器。
以下是文本字段的代码,即SetAlertTableController.swift:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
if indexPath.section == 0 {
cell.textLabel!.text = "Set a Station Alert"
cell.backgroundView = UIImageView(image: UIImage(named: "red-full"))
cell.textLabel?.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.0)
cell.imageView!.image = UIImage(named: "metro-no-pad")
cell.textLabel?.textColor = UIColor.whiteColor()
var searchField = UITextField(frame: CGRectMake(60.0, 25.0, 250.0, 30.0))
searchField.backgroundColor = UIColor.whiteColor()
searchField.borderStyle = UITextBorderStyle.Line
searchField.borderStyle = .RoundedRect
searchField.placeholder = "Search Stations"
searchField.textColor = UIColor.lightGrayColor()
searchField.delegate = self
self.view.addSubview(searchField)
} else if indexPath.section == 1 {
cell.backgroundView = UIImageView(image: UIImage(named: "red-full"))
cell.userInteractionEnabled = false
var slider=UISlider(frame:CGRectMake(10, 120, 300, 10));
slider.minimumValue = 0;
slider.maximumValue = 5;
slider.continuous = false;
slider.value = 0;
slider.addTarget(self, action: "sliderValueDidChange:", forControlEvents: .ValueChanged);
self.view.addSubview(slider);
} else if indexPath.section == 2 {
cell.textLabel!.text = "Set Alert"
cell.backgroundView = UIImageView(image: UIImage(named: "red-full"))
cell.textLabel?.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.0)
cell.imageView!.image = UIImage(named: "confirm")
cell.textLabel?.textColor = UIColor.whiteColor()
cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
}
return cell
}
搜索时,会将结果过滤到表格视图单元格中。当按下正确的结果单元格时,我需要关闭模态视图并显示文本字段中所选单元格的数据。
以下是搜索控制器(ViewController.swift)的代码:
import UIKit
import Foundation
class ViewController: UIViewController {
let kCellIdentifier = "Cell"
var searchController: UISearchDisplayController!
var tableView: UITableView!
var tableData: [String]? {
didSet {
self.tableView.reloadData()
}
}
var tableDataFiltered = [String]()
override func viewDidLoad() {
super.viewDidLoad()
tableView = UITableView(frame: CGRectZero, style: .Plain)
tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: kCellIdentifier)
tableView.delegate = self
tableView.dataSource = self
self.view.addSubview(tableView)
let searchBar = UISearchBar()
searchBar.sizeToFit()
searchBar.becomeFirstResponder()
//tableView.tableHeaderView = searchBar
self.navigationItem.titleView = searchBar;
searchController = UISearchDisplayController(searchBar: searchBar, contentsController: self)
searchController.searchResultsDataSource = self
searchController.searchResultsDelegate = self
searchController.searchResultsTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: kCellIdentifier)
tableData = ["Bournemouth", "Branksome", "Parkstone"]
let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "dismissView")
self.navigationItem.rightBarButtonItem = cancelButton
}
func dismissView() {
dismissViewControllerAnimated(true, completion: nil)
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
println(searchBar.text)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
tableView.frame = self.view.bounds
}
}
extension ViewController: UITableViewDataSource {
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView != self.tableView {
return self.tableDataFiltered.count
}
if let count = tableData?.count {
return count
}
return 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier, forIndexPath: indexPath) as! UITableViewCell
var data: String
if tableView != self.tableView {
data = tableDataFiltered[indexPath.row]
} else {
data = tableData![indexPath.row]
}
cell.textLabel?.text = data
return cell
}
}
extension ViewController: UITableViewDelegate {
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let data = tableData?[indexPath.row] {
dismissViewControllerAnimated(true, completion: nil)
println(indexPath.row)
}
}
}
在这个阶段,一切都能正常工作,甚至在点击时忽略模态视图,我只是无法找到将结果传递回前一个控制器文本字段的方法。任何帮助都非常感谢。
没有故事板,最好或更实际的方法是什么?
声称问题与以前的帖子重复并且在删除此帖子的边缘的人,所有其他帖子都在Objective-C而不是Swift,或者他们严重依赖于故事板和segue使用。
不幸的是,你不能在没有故事板的情况下使用segues。
答案 0 :(得分:5)
有多种方法可以做到这一点,我建议的方法(因为你有使用UITableViewController
的代表的经验)将创建一个swift协议,作为UISearchController
上的委托看起来像这样:
import UIKit
protocol ViewControllerDelegate {
func searchViewControllerDidSelectResult(searchVC:ViewController,result: String)
}
class ViewController: UIViewController {
var delegate: ViewControllerDelegate?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let data = tableData?[indexPath.row] {
if let delegate = self.delegate {
delegate.searchViewControllerDidSelectResult(self, result: data)
}
// dismissViewControllerAnimated(true, completion: nil) // Personally I would dismiss the search view controller within the delegate method of the view controller with the text field
println(indexPath.row)
}
}
}
具有文本字段的视图控制器将看起来像这样。您的SetAlertTableViewController
需要符合ViewControllerDelegate
,如此:
class SetAlertTableViewController: UITableViewController, ViewControllerDelegate
并且还实现协议中声明的方法以在文本字段中设置文本:
func searchViewControllerDidSelectResult(searchVC:ViewController, result: String) {
// Keep track of the result
self.result = result
self.tableView.reloadData()
self.dismissViewControllerAnimated(true, completion: nil)
}
您还需要确保在为搜索结果显示ViewController
时,您可以在其上设置委托,以便知道它的委托是什么!如果您需要更多帮助,请告诉我们!
答案 1 :(得分:0)
很难从使用过的惯例(包括我自己)中脱身。
而不是写
if let delegate = self.delegate {
delegate.searchViewControllerDidSelectResult(self, result: data)
}
最好采用以下方法:
delegate?.searchViewControllerDidSelectResult(self, result: data)
由于不允许我发表评论,我只是提供了一个更新(Swift是关于简洁和优雅的)。我花了几个星期的时间用这种方式写作。