2015-10-23 5 views
2

Для любого созданного объекта я обычно использую две две области: 1) Singleton 2) {local scope}. Я ищу что-то промежуточное.Обмен данными между VIewControllers - iOS

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

Я не хочу наследовать весь контроллер вида из другого класса, создавая там переменную. Поскольку контроллер просмотра может использоваться повторно для разных объектов. Я хочу создать объект, который оживает до запуска первого контроллера представления, живет в рамках 5 контроллеров представления и затем умирает после того, как я его каким-то образом сохранил. В любом случае я могу сделать это в iOS.

+2

Почему вы не хотите передавать объект между контроллерами? Это правильное решение. – rmaddy

+0

Потому что это делало контроллеры просмотра тесно связанными и трудно понимающими поток. Это похоже на сохранение локальных переменных в первом VC, а затем их передачу. Если что-то отредактированное первым VC было необходимо 4-м, то я просто передавал его через 4VC без причины. – ila

+0

Если передача данных между контроллерами делает ваш код тесно связанным, вы делаете это неправильно или вам нужно уточнить свои потребности и то, что вы делаете. – rmaddy

ответ

0

As Mat сказал, что вы можете сделать, это то, что. Для меня лучше создать конкретный класс для этого, который будет выполнять одну конкретную работу.

class EditingSession { 
    class Factory { 
     private static let session = EditingSession() //do it lazy 
     static func create() -> EditingSession { 
      return session 
     } 
    } 

    func openSession() { 

    } 

    func endSession { 

    } 

    func getData() -> AnyObject { 
     ... 
    } 
} 
  1. В сеансе редактирования создать личное инициализатор. Фабрика должна предоставить общий экземпляр.

  2. Вы можете передать этот класс своим ViewControllers и манипулировать данными. Вы можете ввести его или просто установить как свойство в своем VC или VM.

  3. Если вы закончили работу с редактированием, вы должны завершить сеанс и очистить данные или другие материалы.

2

Альтернативой является использование AppDelegate. В нем вы можете объявить глобальную переменную, чем 2 функции, первую для получения текущего значения, а другую - для установки значения.

Это может дать что-то вроде этого:

// Get AppDelegate instance 
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate; 

// Use your getter to get the current value 
var something = appDelegate.getYourStuff(); 

// Or use a setter to set it, a modifier to modify oit 
appDelegate.setYourStuff(yourStuff); 
appDelegate.modifiyYourStuffAttribute(newAttributeValue); 

не понимают, если такой метод является плохой практикой или нет, но это работает для меня.

Открыт для других предложений!

+0

Согласен с Mat. Вы можете определить свой объект в AppDelegate, init в своем первом контроллере представления и убить его, когда закончите редактирование в пятом контроллере представления. – truongky

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