2015-09-07 2 views
0

я есть ThirdView в моем «старт» зренияdidSelectRowAtIndexPath performSegueWithIdentifier = я получаю ноль в целевой точки зрения

import Foundation 
import UIKit 

class ThirdView : UITableViewController { 

var jsonz:NSArray = ["Ray Wenderlich"]; 
    var valueToPass : String?; 
    var programVar : String?; 

override func viewDidLoad() { 

    super.viewDidLoad() 
} 

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

    var newProgramVar = "lol"; 

    let destinationVC = segue.destinationViewController as! FourthView 
    destinationVC.programVar = newProgramVar 
} 

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

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

    return self.jsonz.count; 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let myCell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell 

    myCell.textLabel?.text = self.jsonz[indexPath.row] as? String; 
    return myCell; 
} 
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    let valueToPass = "asd"; 
    let destinationVC = FourthView() 
    destinationVC.valuePassed = valueToPass; 

    self.performSegueWithIdentifier("restDetail", sender: tableView); 
} 
} 

У меня есть идентификатор SEGUE: restDetail http://i.stack.imgur.com/6SMtS.png

Когда я запустить проект и нажмите на ячейку , я не могу получить переменную valuePassed в «втором» представлении, я получаю нуль. Пожалуйста, помогите, почему? Но я нормально получаю переменную programVar от функции prepareForSegue, это нормально. У меня есть только проблема с didSelectRowAtIndexPath segue.

Это мой FourthView:

import UIKit 

class FourthView: UIViewController { 


var valuePassed:String! 
var programVar:String! 

override func viewDidLoad() { 


    super.viewDidLoad() 
    println(valuePassed); 
    println(programVar); 


    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 

Смотрите здесь то, что я имею в выходе:

nil 
lol 
nil 
lol 

http://i.stack.imgur.com/wbHfm.png

И второй вопрос: почему на выходе он показывает в 4 раза? Извините за мой английский.

+0

Для кого-то, у кого такая же проблема, посмотрите, что вам нужно добавить для функции prepareForSegue() (в моем примере): 'let indexPath: NSIndexPath = self.tableView.indexPathForSelectedRow()!', А затем вы можете использовать свой indexPath в prepareForSegue, например, что я использовал: 'destinationVC.name = self.jsonz [indexPath.row] as? Строка; '. В FourthView я объявляю String ** name **, и это одобрено. – GenRiH

ответ

0

В didSelectRowAtIndexPath вы не инициализируете экземпляр FourthView правильно.

Эта линия:

let destinationVC = FourthView()

Создает случайный экземпляр FourthView, что это не тот, который вы используете в качестве пункта назначения. Если вы хотите передать значение в FourthView, это обычно лучше всего сделать в prepareForSegue.

Как вы можете видеть в приведенной ниже строке, здесь вы устанавливаете переменную destinationVC экземпляру FourthView, который является целевым контроллером View вашего сегмента.

let destinationVC = segue.destinationViewController as! FourthView

+0

i anderstand, спасибо – GenRiH

0

Проблема заключается в следующем коде:

let valueToPass = "asd"; 
let destinationVC = FourthView() 
destinationVC.valuePassed = valueToPass; 

Вы выделяете временный экземпляр FourthView и передачи данных к нему. И после этого вы выполните сеанс. Выполнение segue инициализирует контроллер вашего вида и загружает его в представление (другое, а не тот, который вы инициализировали вручную в didSelectRowAtIndexPath). Вам необходимо передать данные из метода prepareForSegue:.

+0

i anderstand, спасибо – GenRiH

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