prepareForSegue 将从数组中提取的错误(延迟)字符串发送到第二个视图控制器

prepareForSegue sending the wrong (delayed) string extracted from array to second view controller

在 VC1 中,我试图从数组中提取一个字符串,并将其发送到 VC2。我在我的 prepareForSegue 方法中执行此操作。但是,当我 运行 它时,有一个滞后:

  1. 我在 VC1 中点击 row1(apples) 它转到 VC2 并在 VC2
  2. 中显示苹果
  3. 点击返回 VC 1
  4. 点击第2行(香蕉),字符串作为苹果传递给 VC2
  5. 点按返回 VC1
  6. 我在 VC1 中点击第 3 行(橙子),它转到 VC2 并在 VC2 中显示香蕉 等等等等

下面是我正在使用的代码。如果有人可以帮助我告诉我哪里出错了,将不胜感激。谢谢..

class HomeSearchViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, UISearchBarDelegate {

var filteredArray = [String]()
var shouldShowSearchResults = false
var searchController: UISearchController!

var databaseRef = FIRDatabase.database().reference()
var loggedInUser = AnyObject?()
var loggedInUserData = AnyObject?()


var productSearchArray = [AnyObject?]()
var productBrandArray = [String]()
var itemNameArray = [String]()
var picUrlArray = [String]()
var skuArray = [String]()
var nextScreenRow = Int()
var nextSceenRowNonSearch = Int()
var toPass = String()
var toPassSearch = String()
var initialSearchList = ["Apple", "Samsung", "Windows", "Google"]

    @IBOutlet weak var tblSearchResults: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()


        loadListOfCountries()
        configureSearchController()


        tblSearchResults.delegate = self
        tblSearchResults.dataSource = self
    }

// MARK: Table Cells Stuff

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if shouldShowSearchResults {
            return filteredArray.count
        }
        else {
            return initialSearchList.count
        }
    }


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("homeSearchCell", forIndexPath: indexPath) as! HomeSearchTableViewCell

      //note to self: need to pass on more than one variable for search

        if shouldShowSearchResults {

            cell.configure(filteredArray[indexPath.row], itemNameLabel: "text'", skuLabel: "TEXT")
            //cell.textLabel?.text = filteredArray[indexPath.row]
        }
        else if shouldShowSearchResults == false{
            cell.configureNISearch(initialSearchList[indexPath.row])

        }

        return cell
    }


    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 60.0
    }

//找出行并传递变量。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)


    //println("You selected cell #\(indexPath.row)!")spDetailSegue
    if shouldShowSearchResults {
        nextScreenRow = indexPath.row

        // get to the next screen
        self.performSegueWithIdentifier("spDetailSegue", sender: self)

    }
    else if shouldShowSearchResults == false{

        nextSceenRowNonSearch = indexPath.row

        // get to the next screen
        self.performSegueWithIdentifier("searchSegue", sender: self)
    }

}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {



    if (segue.identifier == "spDetailSegue") {
        //Checking identifier is crucial as there might be multiple
        // segues attached to same view
        let detailVC = segue.destinationViewController as? pDetailViewController;
        detailVC!.toPassSku = skuArray[nextScreenRow]

        // print("vSku", )
    }
    if (segue.identifier == "searchSegue"){

        //print("selected indexpath = ", selectedIndex)
        let detailVC = segue.destinationViewController as? SearchDetailViewController;
        detailVC!.toPassSearch = initialSearchList[nextSceenRowNonSearch]
    }

}

//搜索栏内容

func configureSearchController() {
        // Initialize and perform a minimum configuration to the search controller.

        searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.dimsBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = "Search here..."
        searchController.searchBar.delegate = self
        searchController.searchBar.sizeToFit()
        //searchController.searchBar.scopeButtonTitles = ["Products", "Users"]
        searchController.searchBar.barTintColor = UIColor.whiteColor()
        searchController.searchBar.tintColor = UIColor.redColor()
        // Place the search bar view to the tableview headerview.
        tblSearchResults.tableHeaderView = searchController.searchBar
    }

    func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
        shouldShowSearchResults = true
        tblSearchResults.reloadData()
    }


    func searchBarCancelButtonClicked(searchBar: UISearchBar) {
        shouldShowSearchResults = false
        tblSearchResults.reloadData()
    }

    func searchBarSearchButtonClicked(searchBar: UISearchBar) {
        if !shouldShowSearchResults {
            shouldShowSearchResults = true
            tblSearchResults.reloadData()
        }

        searchController.searchBar.resignFirstResponder()
    }

    func updateSearchResultsForSearchController(searchController: UISearchController) {
        let searchString = searchController.searchBar.text

        // Filter the data array and get only those countries that match the search text.
        filteredArray = itemNameArray.filter({ (item_name) -> Bool in
            let countryText: NSString = item_name

            return (countryText.rangeOfString(searchString!, options: NSStringCompareOptions.CaseInsensitiveSearch).location) != NSNotFound
        })

        // Reload the tableview.
        tblSearchResults.reloadData()
    }

}

尝试删除下面的行

  tableView.deselectRowAtIndexPath(indexPath, animated: true)

来自你的 didSelectRowAtIndexPath.

如@Lu_ 所言,

are you sure that didSelectRowAtIndexPath is called before prepareForSegue? you did not put your segue action from cell to controller?

这解决了问题。谢谢!