2016-05-12 1 views
0

У меня есть 3 UIViewControllers сказать: v1ViewController v2ViewController v3ViewController.Как довести значение из UIViewController с помощью делегата без инстанцирования объекта

Я поставил контроллеры как v2 на v1 и v3 на v2. Теперь я хочу вернуть значение v1ViewController из v3ViewController с помощью делегатов. На v3Viewcontroller я написал:

for vc in self.navigationController!.viewControllers{ 
      if vc is v1ViewController{ 
       delegate?.returnFilteredImage(imageView.image!) 
       self.navigationController?.popToViewController(vc, animated: true) 
      } 

     } 

Как я могу использовать делегат, потому что в v1ViewController я не создать объект v3Viewcontroller; следовательно, я не могу подключить делегата к себе.

Так как я могу это сделать.

+0

Вы можете использовать ключ наблюдающего значения: http://nshipster.com/key-value-observing/ – henrikstroem

+0

Пытались ли вы с NSNotificationCenter наблюдателем. Если это связано только с передачей значения, возможно, это может быть полезно –

+0

@ AnkitaShah Уведомление - это простой способ, но я хочу попробовать его через делегирование – ankit

ответ

0

1.Использование delgates

создать протокол и реализовать в вашем firstviewcontroller

protocol My { 
func returnFilteredImage(image: UIImage) 
} 

class FirstViewController: UIViewcontroller, My { 

    ... 
    func returnFilteredImage(image: UIImage) { 
} 

} 

и в вашем thirdViewController создать свойство и назначить FirstViewController делегата на это.

class ThirdViewController: UIViewController { 
    var delegate: My? 
    ... 

override func viewDidLoad() { 
    super.viewDidLoad() 

for vc in self.navigationController!.viewControllers{ 
     if vc is FirstViewController { 

     let vc1 = vc as! FirstViewController 
     self.delegate = vc1 

      self.delegate?.returnFilteredImage(imageView.image!) 
      self.navigationController?.popToViewController(vc, animated: true) 
     } 

    } 
} 

} 

2.Использование локальных уведомлений check here

Вы можете сделать это с помощью локальных уведомлений

class FirstViewController: UIViewController { 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    //add observer 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.didgetImage(_:)), name: "receiveImageNotification", object: nil) 

} 

func didgetImage(notification: NSNotification) { 

if let image = notification.userInfo?["image"] as? UIImage { 
    // do something with your image 
} 
} 

} 

и от третьего контроллера представления, первое уведомление

let imageDataDict:[String: UIImage] = ["image": image] 


NSNotificationCenter.defaultCenter().postNotificationName("receiveImageNotification", object: self, userInfo: imageDataDict) 

Надеется, что это помогает :)

+0

, он будет вызывать ошибку 'self.delegate = vc', поскольку мы не можем назначить делегата для просмотра контроллера – ankit

+0

да можно использовать центр уведомлений для этого – ankit

+0

мы можем использовать оба. – Sahil

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