2014-10-05 8 views
43

Я занимаюсь простым приложением iOS с контроллером TableView и detailView. Все, что я хочу, это передать данные через segue.Передача данных через segue

this is how it looks like

это, как он выглядит.

Все, что я хочу, это то, что вы нажмете на «Markíza», он откроет URL-адрес видеоролика 1, и если вы нажмете «TV JOJ», он откроет URL-адрес видеоролика 2 в проигрывателе.

Моего Tableview клетка:

struct Program { 
     let category : String 
     let name : String 
    } 


    var programy = [Program]() 
     self.programy = [Program(category: "Slovenské", name: "Markíza"), 
         Program(category: "Slovenské", name: "TV JOJ")] 
+0

, но я думаю, что это в Objective-C, и мне нужно его быстрым. – patrikbelis

+0

Возможный дубликат [Передать переменные из одного ViewController в другой в Swift] (http://stackoverflow.com/questions/24044108/pass-variables-from-one-viewcontroller-to-another-in-swift) – Paulw11

ответ

107

Swift работает точно так же, как Obj-C, но переработан на новом языке. У меня не так много информации из вашего сообщения, но давайте дадим имя каждому TableViewController, чтобы помочь с моим объяснением.

HomeTableViewController (это скриншот у вас есть выше)

PlayerTableViewController (это экран плеера вы хотите поехать в)

С учетом сказанного, в PlayerTableViewController вам нужно иметь переменная, которая будет хранить переданные данные. Только под объявлением класса есть что-то вроде этого (если вы собираетесь хранить-структуру как единый объект, а не массив:.

class PlayerTableViewController: UITableViewController { 

    var programVar : Program? 

    //the rest of the class methods.... 

После этого есть два способа вы можете отправить данные на новый TableViewController

1) Использование prepareForSegue

в нижней части HomeTableViewController вы будете использовать методы prepareForSegue для передачи данных. Вот пример кода, который вы будете использовать:

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

    // Create a variable that you want to send 
    var newProgramVar = Program(category: "Some", name: "Text") 

    // Create a new variable to store the instance of PlayerTableViewController 
    let destinationVC = segue.destinationViewController as PlayerTableViewController 
    destinationVC.programVar = newProgramVar 
    } 
} 

После PlayerTableViewController загрузила переменная будет уже установлен и использовать

2) Использование didSelectRowAtIndexPath

Если конкретные данные должны отправляться на основе выбранной ячейки, вы можете использовать didSelectRowAtIndexPath. Чтобы это сработало, вам нужно дать вашему segue имя в представлении раскадровки (дайте мне знать, если вам нужно знать, как это сделать).

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

    // Create a variable that you want to send based on the destination view controller 
    // You can get a reference to the data by using indexPath shown below 
    let selectedProgram = programy[indexPath.row] 

    // Create an instance of PlayerTableViewController and pass the variable 
    let destinationVC = PlayerTableViewController() 
    destinationVC.programVar = selectedProgram 

    // Let's assume that the segue name is called playerSegue 
    // This will perform the segue and pre-load the variable for you to use 
    destinationVC.performSegueWithIdentifier("playerSegue", sender: self) 
} 

Позвольте мне знать, если вам нужна любая другая информация об этом

+0

sasha. проверьте мой ответ. Мне нужно.Если вы нажмете на CELL1, он откроет ссылку 1, если будет нажата кнопка CELL2, она откроет link2 – patrikbelis

+3

. Я попробовал 2) подход, и я всегда получаю исключение, говоря, что «Receiver PlayerTableViewController не имеет идентификатора« playerSegue ». Просто вызов 'performSegueWithIdentifier' работает нормально, но затем данные не переносятся в новое представление. : [ – althaus

+0

@althaus У вас есть уверенность, что в вашем раскадровке есть секция с именем «playerSegue»? На этом изображении показано, что вы должны искать. Если это не удастся, отправьте мне несколько скриншотов, и я проверю это. https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/art/SB_H_set_segue_identifier_2x.png –

10

С Swift 3

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if (segue.identifier == "MainToTimer") { 
     let vc = segue.destination as! YourViewController 
     vc.var_name = "Your Data" 
    } 
} 
Смежные вопросы