2015-10-12 4 views
0

Я уже несколько дней борется с передачей массива от моего SecondViewController к моему FirstViewController с использованием Swift.Прохождение массива через segue in swift

Из моего исследования я обнаружил, что segue с prepareForSegue будет жизнеспособным вариантом, но я не могу понять, как это понять. Что я делаю не так?

Моих prepareForSegue в SecondViewController выглядит следующим образом:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     var DVC: FirstViewController = segue.destinationViewController as! FirstViewController 
     DVC.mySeguedArray = myIncomeArray 
} 

Мой FirstViewController выглядит следующим образом:

class FirstViewController: UIViewController { 
@IBOutlet weak var textView: UITextView! 
var myIncomeArray: [Income] = [] 
var mySeguedArray: [Income] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    myIncomeArray = mySeguedArray 
} 

Также стоит отметить, что я уверен, что я наполнение массива в SecondViewController поскольку я тестирую его, распечатывая размер массива при добавлении к нему новых объектов Income. Но массив в FirstViewController просто возвращает 0 при проверке его размера после segue.

Edit: Добавлено изображение раскадровки StoryBoard

+0

что инициирует переход к первому vc? и у вас есть контроллер навигации между ними или это шоу-шоу или что-то еще? – Lukas

+0

Я попробовал теперь ctrl + перетащить раскадровку с кнопки добавления на моей кнопке добавления на SecondViewController на свой FirstViewController, но это только позволяет мне нажимать, модально и обычай. –

+0

push отлично, но убедитесь, что вы положили правильный идентификатор segue в инспекторе атрибутов – Lukas

ответ

0

Ваш код выглядит нормально, используйте следующий prepareforsegue, как это помогает понять, где эта проблема может быть

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "segueIdInStoryboard" { 
     if let DVC = segue.destinationViewController as? FirstViewController{ 
      DVC.mySeguedArray = myIncomeArray 
     } else { 
      print("Data NOT Passed! destination vc is not set to firstVC") 
     } 
    } else { print("Id doesnt match with Storyboard segue Id") } 
} 

class FirstViewController: UIViewController 
{ 
    @IBOutlet weak var textView: UITextView! 
    var myIncomeArray: [Income]! 
    var mySeguedArray: [Income]!{ 
     didSet{ 
      myIncomeArray = mySeguedArray //no need to call viewDidLoad 
     } 
    } 
} 
+0

Все с segue работает отлично, но похоже, что каждый раз, когда я перехожу к «SecondViewController» с одним исключением, создается новый пустой 'myIncomeArray', если я нажму кнопку' Back' из 'FirstViewController'. Затем он сохраняет данные. –

+0

Хорошо, мне удалось решить проблему. Я сделал это, выполнив prepareForSegue в колоде «FirstViewController». Поэтому я всегда перехожу один и тот же массив, а не инициализирую новый. Спасибо всем за ваши ответы, я многому научился! –

1

Знаете ли вы, что массив в Swift является типом значения. Поэтому, когда вы назначаете массив какой-либо другой переменной или передаете ее некоторому методу, значение передается; а не ссылка на фактический объект. Когда вы передаете свой массив контроллеру второго представления, он копирует содержимое исходного массива. Затем вы добавляете этот массив, который не меняет содержимое исходного массива.

Я предлагаю вам создать какой-то шаблон обратного вызова или делегирования от второго контроллера представления до первого контроллера просмотра, чтобы сообщить об изменениях, чтобы контроллер первого вида также изменял исходный контент массива.

Вот небольшой фрагмент кода, который поможет вам разобраться в этом,

let originalArray = ["a", "b", "c"] 

var newArray = originalArray 

newArray.append("d") 

print(originalArray) // prints ["a", "b", "c"] 
print(newArray) // prints ["a", "b", "c", "d"] 
+0

Хорошо, я посмотрю, что завтра.Но до тех пор, пока я могу переопределить массив каждый раз, когда я перехожу, это не будет проблемой, так как мой FirstViewController только там, где я хочу отображать их в textView. –

1

Вы можете использовать протокол для передачи данных между контроллерами зрения

protocol YourFirstViewControllerDelegate: class { 
    func onButtonClicked(yourString: [String]) 
} 

для па петь данные из первого контроллера представления на второй в главном представлении контроллера, если вы хотите, чтобы показать свой первый контроллер представления:

  1. вы должны установить главный контроллер представления на ваш взгляд контроллера делегат, yourFirstViewController.setDlegate(self)

  2. В FirstViewController вы должны поднять событие в основном с onButtonClicked([String])

  3. в onButtonClicked ([String]) вы можете вызвать secondViewController и передать свой массив с onSecondViewController([String])

    class MainViewController: UIViewController,YourFirstViewControllerDelegate{ 
    var yourString = [String]() 
    weak var vcFirst: FirstViewController? 
    weak var vcSecond: SecondViewController? 
    func onFirstViewController(){ 
    
        if (self.vcFirst == nil){ 
         self.vcFirst = self.storyboard?.instantiateViewController(withIdentifier: "FirstViewController") as? FirstViewController 
         self.vcFirst!.view.translatesAutoresizingMaskIntoConstraints = false 
         self.vcFirst?.setDelegate(youeFirstViewControllerDelegate: self) 
        } 
        self.setActiveController(viewController: self.vcFirst) 
    
    } 
    
    func onSecondViewController(yourString:[String]){ 
        if (self.Second == nil){ 
         self.Second = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController 
         self.vcSecond!.view.translatesAutoresizingMaskIntoConstraints = false 
    self.vcSecond.setArray(yourArray: self.yourArray) 
        } 
        self.setActiveController(viewController: self.vcSecond) 
    
    } 
    
    ....// your view controller method 
    
    func onButtonClicked(yourString: [String]){ 
    self.yourString = yourString 
    onSecondViewController(yourString:self.yourString) 
    } 
    

В своем первом контроллере представления

class FirstViewController: UIViewController{ 
    weak var yourFirstViewControllerDelegate: YourFirstViewControllerDelegate? 
    var yourString = ["test1","test2"] 
// all your overide method should be here 
    func setDelegate(yourFirstViewControllerDelegate: YourFirstViewControllerDelegate){ 
    self.yourFirstViewControllerDelegate = yourFirstViewControllerDelegate 
    } 

func onButtonClicked(){ 
    self.yourFirstViewControllerDelegate.onButtonClicked(self.yourString) 
    } 

В вашем втором контроллере представления

class SecondViewController: UIViewController{ 
var yourString = [String] 
// all your overide method should be here and you can use your [String] 
func setArray(yourString:[String]){ 
self.yourString = yourString 
} 
} 

Я не Mac OS, чтобы проверить мой код теперь, пожалуйста, просто прочитайте этот код не копировать, Я исправлю этот код завтра

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