2016-03-27 1 views
0

Я запускаю Xcode 7.3 и используя Swift 2.2. У меня возникают проблемы с передачей данных с моего первого контроллера представления на второй контроллер представления. Я создал переменную string в моем первом контроллере представления, который удерживает выбранную строку в представлении таблицы, и она работает. Я также создал другую переменную string в моем втором контроллере представления, который должен содержать имя выбранной строки, а затем передать текст на метку.Как передать выбранную строку строки в виде таблицы на другую страницу ViewController? (Swift 2)

import UIKit 
import Parse 
import ParseUI 

class FruitListPage: UIViewController, UITableViewDelegate, UITableViewDataSource { 


var selectedFruit = String() 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    let fruitName:Scanner2 = self.storyboard?.instantiateViewControllerWithIdentifier("scanPage") as! Scanner2 
    fruitName.loadView() 
    let nameShop = textArray[indexPath.row] 
    print(nameShop) 
    selectedFruit = nameShop 

    print(selectedFruit) 

    fruitName.selectedFruit2 = selectedFruit 

} 

Все работает полностью мелкий блок здесь в первом контроллере представления, и я могу видеть имя фрукты каждый раз, когда я нажмите строку в Tableview. Реальная проблема заключается в том, что строка selectedFruit2 во втором контроллере просмотра никогда не захватывает данные с первого контроллера представления. Любая подсказка?

import UIKit 
import Parse 

class Scanner2: UIViewController { 

@IBOutlet var fruitNameLabel: UILabel! 

var selectedFruit2 = String() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    print(selectedFruit2) 

} 

} 
+0

Документация 'loadView':« Вы никогда не должны вызывать этот метод напрямую ». Также обратите внимание, что вы устанавливаете 'selectedFruit2' _after_, вы загрузили представление. Удаление 'loadView', вероятно, устранит вашу проблему, хотя' viewWillAppear (_ :) 'будет, вероятно, безопаснее, чем' viewDidLoad' – Sulthan

ответ

0

Подключите ViewController в раскадровке с Segue и установить его идентификатор в качестве " scanPageSegue ", например ... затем:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    performSegueWithIdentifier("scanPageSegue", sender: textArray[indexPath.row]) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "scanPageSegue" { 
     if let fruitName = segue.destinationViewController as? Scanner2, 
      selectedFruit = sender as? String { 
      fruitName.selectedFruit2 = selectedFruit 
     } 
    } 
} 
+0

Спасибо, это было очень полезно и легко ... Я пробовал функцию prepareforsegue раньше, но для меня очень важная часть было соединить раскадровку с segue и сделать performseguewithidentifier, затем сделать prepareforsegue. Я застрял на этом почти 3 дня. Это что-то новое в быстрой 2? – bbkrz

+0

Не совсем, это базовый механизм для использования в storyBoard, это было так же и перед быстрым: D В любом случае ... теперь вы это знаете. В основном вам не нужно создавать программно VC с раскадрой, вместо этого используйте segue, вы также можете использовать собственный подкласс для segue с вашими пользовательскими переходами. –

0

Попробуйте с этим, в вашем Tableview: didSelectedRowAtIndexPath:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let fruitName:Scanner2 = self.storyboard?.instantiateViewControllerWithIdentifier("scanPage") as! Scanner2 
    selectedFruit = textArray[indexPath.row] 
    fruitName.selectedFruit2 = selectedFruit 
    self.presentViewController(fruitName,animated:true,completion:nil) 
} 
0

Вы можете попробовать это:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
if let indexPath = self.tableView.indexPathForSelectedRow { 
let destinationVC = segue.destinationController 
destinationVC.string = textArray[indexPath] //this is the string in second view controller 
} 
} 
1

Вы можете попробовать сделать глобальную переменную и в методе override func prepareForSegue, инициализировать его tableView.indexPathForSelectedRow!.row. Вот как я это сделал, и все получилось отлично.

Смежные вопросы