2016-04-10 10 views
1

UIViewController numaralı bir ebeveynim var ve iki farklı görüntüleme kabı var - bunların her biri içte UIViewController içeriyor. Bunun gibi her nasılsa görünür:Bir konteynerden diğerine nasıl geçebilirim, her ikisi de aynı kullanıcı denetleyicisine hızlı bir şekilde gömülür?

enter image description here

Ben kullanıcı sol birinde saklanan düğmesine bastığında sağ Kap üzerindeki etiket değiştirmek istiyorum.

class ParentController: UIViewController { 

    var delegateEmbedded:HandleEmbedded? 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "segueToFirstEmbeddedController"){ 

     if let embeddedView = segue.destinationViewController as? EmbeddedContainer { 

      self.delegateEmbedded = embeddedView 
     } 


    } 
: Ben benim ana bileşende

  • :

    Şimdiye kadar bir üst görünüm denetleyicisi yerleştirilen bir düğmeye sahip, o zaman sadece bir protokol kullanılarak iken bunu başardı benim konteyner gömülü UIViewController

  • vardı:

    protocol HandleEmbedded: class { 
        func setName(label: String) 
    } 
    
    class EmbeddedContainer: UITableViewController, HandleYourChat{ 
    
        func setName(label: String){ 
         print("setting label to \(label)") 
        } 
    } 
    

Bir üst denetleyiciye yerleştirilen düğmeye sahip olduğumda ve kapsayıcının içindeki etiketini değiştirmek istediğimde yukarıdaki durumun çalışması. Ama ne olur ve düğme de gömülü olduğunda, ancak etiketten farklı bir kapta veriyi nasıl iletmeliyim? Verileri ana denetleyiciden geçmek zorunda mıyım? Bunu yapmanın en iyi yolu nedir?

cevap

1

Bir gömülü ViewController'dan başka bir gömülü ViewController öğesine veri aktarmak için, üst öğeyi aktarmayı taşıyın. Burada üç ViewControllers ve tek bir StringTaker protokolü ile tam bir örnek verdik. Hem ana ViewController hem de LabelViewController bu protokolü uygular. Ana ViewController, ButtonViewController'dan bir dize alır ve katıştırılmış LabelViewController'a aktarır.

ViewController.swift

import UIKit 

protocol StringTaker: class { 
    func takeString(string: String) 
} 

class ViewController: UIViewController, StringTaker { 

    weak var stringTaker: StringTaker? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "EmbedButtonViewController" { 
      let dvc = segue.destinationViewController as! ButtonViewController 
      dvc.delegate = self 
     } else if segue.identifier == "EmbedLabelViewController" { 
      let dvc = segue.destinationViewController as! LabelViewController 
      stringTaker = dvc 
     } 
    } 

    // Receive the string from the ButtonViewController 
    func takeString(string: String) { 
     // Pass it to the LabelViewController 
     stringTaker?.takeString(string) 
    } 
} 

ButtonViewController.swift

import UIKit 

class ButtonViewController: UIViewController { 

    weak var delegate: StringTaker? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func generateString(sender: UIButton) { 
     let cities = ["Boston", "Paris", "Sydney", "Mumbai", "Lima"] 

     // Pick a random city 
     let city = cities[Int(arc4random_uniform(UInt32(cities.count)))] 

     // Pass the string to the delegate 
     delegate?.takeString(city) 
    } 
} 

LabelViewController.swift

import UIKit 

class LabelViewController: UIViewController, StringTaker { 

    @IBOutlet weak var myLabel: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    func takeString(string: String) { 
     myLabel.text = string 
    } 
} 

Unutulmaması gereken nokta:

  1. LabelViewController ve ButtonViewController bunları kullanır ViewController hakkında hiçbir şey bilmiyorlar. Bu onları yeniden kullanmayı kolaylaştırır. Bunları başka bir viewController'a gömebilir ve StringTaker protokolünü doğru bir şekilde uygulayıp delegate'u ayarlamış olursanız, her şey çalışır.
  2. Gömme yerleştirme adlandırma ve daha sonra delegeleri prepareForSegue'da doğru şekilde ayarlamada bu düğmeyi takmanın anahtarı. Seferler Kap görünümüneBelge Ana Sayfası görünümünde eklendiğinde görüntülenebilir.
İlgili konular