以快速编程方式将数据从一个视图传递到另一个视图

时间:2015-04-25 19:02:31

标签: ios swift uitableview search

我已经搜索过该网站,我在这个主题周围找到的唯一线索仍未得到答复,所以我希望我能有更多的运气。

我相对确定我要做的事情相当容易,但我似乎无法找到答案。

我有一个带有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。

2 个答案:

答案 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是关于简洁和优雅的)。我花了几个星期的时间用这种方式写作。