2016-03-22 5 views
0

Все, что я видел в стеке, это передача данных с входа, на другой контроллер просмотра при нажатии кнопки. Предположим, у меня есть var banana, который представляет собой массив словарей, но как только моя функция в ViewA.swift выполняется, загружая banana, я хочу другой viewController, скажем, ViewB.swift для управления этими данными по своему усмотрению. У меня нет перехода от одного контроллера представления к другому. EDIT: Это на самом деле два TableViewControllers ****Как мне получить доступ к переменной с другого контроллера вида?

Я посмотрел в NSNotificationCenter, но это не похоже на работу с моим типом переменной, которая является массивом словарей

+0

Так что вы хотите передать уаг банан ViewB.Swift? Что вы пробовали? Вы создали свойство в ViewB? –

+0

Как выглядит ViewB, связанный с ViewA, или они вообще связаны? – Eendje

+0

Их совсем нет. Сегментов нет. Единственное отношение - это оба ViewControllers, и они оба находятся в одном проекте. – Waffles

ответ

0

Убедитесь, что у вас есть учитывая все ViewControllers идентификатор, то экземпляр их:

guard let viewControllerB = storyboard?.instantiateViewControllerWithIdentifier("ViewControllerB") as? ViewControllerB else { 
    fatalError(); return 
} 
// then access the variable/property of ViewControllerB 
viewControllerB.banana = whatEver 

Добавлено разъяснений

Это один работает для меня.

Просто убедитесь, что вы указали TableViewController идентификатор, иначе вы не сможете его создать. Также убедитесь, что вы передали результат instantiateViewControllerWithIdentifier в класс TableViewController, иначе вы не сможете получить доступ к его переменным (я видел, что вы боретесь с этим, если вы получаете сообщение об ошибке, что UIViewController не имеет члена «туАггау», то вы, вероятно, забыли бросить результат)

class TableViewController: UITableViewController { 
    var myArray = [String]() 
} 

class ViewController: UIViewController { 
    func someEventWillTriggerThisFunction() { 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     guard let tableViewController = storyboard.instantiateViewControllerWithIdentifier("TableViewController") as? TableViewController else { 
      fatalError(); return 
     } 
     tableViewController.myArray = ["Value1", "Value2", "Value3"] 
     /* if you want to present the ViewController use this: */ 
     self.presentViewController(tableViewController, animated: true, completion: nil) 
    } 
} 
+0

Может ли это вызвать проблемы с памятью? Я туман на экземпляре с быстрым, но очень знакомым с объектами на Java и тем, как они общаются друг с другом. SO приведенный выше код, я запускаю его в viewControllerA, создаю экземпляр экземпляра viewControllerB внутри него, а затем у меня есть acecss для просмотра переменныхControllerB. Будет ли это перенесено на представление, связанное с viewControllerB? – Waffles

+0

Зачем? У вас есть один экземпляр viewControllerA и один экземпляр viewControllerB. Да, вы можете получить доступ к переменным viewControllerB. Если вы измените переменные viewControllerB в экземпляре, который вы держите в viewControllerA, они видны в viewControllerB. –

+0

Я получаю ошибку при запуске этого кода, и он говорит «ошибка ожидаемой декларации» – Waffles

0

Без использования SEGUE, вы можете создать экземпляр View контроллера и установить общественный parameteres.

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil) 
let vc = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! ViewB 

/* Here you have the reference to the view, so you can set the parameters*/ 

vc.parameterInViewB = banana 

/* At this point you can present the view to the user.*/ 

self.presentViewController(vc, animated: true, completion: nil) 
+0

поэтому, когда я делаю vc.parameterInViewB = «привет», он говорит мне что vc не имеет члена «parameterInViewB», но это определенно делает, поскольку я добавил его как var.Точная ошибка: «Значение типа». UIViewController не имеет члена «CategorizedArray» « – Waffles

+0

, в конце 2 строки есть листинг, так как! ViewB вам это нужно. В вашей ошибке ясно, что вы все еще используете объект по умолчанию», UIViewController " – UlyssesR

1

NSNotificationCenter для доступа к данным.

Try Ниже код

//Sent notification 

let dictionary = ["key":"value"]  
NSNotificationCenter.defaultCenter().postNotificationName("passData", object: nil, userInfo: dictionary) 

//Receive notification 

NSNotificationCenter.defaultCenter().addObserver(self, 
selector:"myMethod:", name: "passData", object: nil) 

//Receive notification method 

func myMethod(notification: NSNotification){ 
print("data: \(notification.userInfo!["key"])") 
+0

, поэтому я попробовал это, но он говорит мне, что моя переменная не работает, поскольку это массив словарей, а не только словарь. Наверное, я могу его пропустить, но есть 100 словарей> _> это или что-то? – Waffles

+0

Хорошо, я просто зациклился на моем массиве и добавил словари с помощью отправленного уведомления. Затем я поместил код, который вы предоставили мне во второй диспетчер представлений в viewDidAppear. Как в функции, так и в разделе «уведомление о получении». он ничего не делает. Предполагаю, что мне нужно вызвать функцию, но я не уверен, что должен быть аргументом. – Waffles

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