2016-03-30 20 views
1

Swift çok yeni ve bazı programlama bilgisi var ve Swift kod üzerinde bir Udemy ve Lynda şeyler izledim, oyun alanında bir yere taşımak için biraz mücadele ediyorum Xcode Projesi.Storyboards and Swift 2.2 Mac App özel denetleyicisi görünüm denetleyicisi değiştir

Ayrıca öğreticiler bulmak biraz zorlaştıran bir Mac uygulaması oluşturmak istiyorum.

En yeni Swift ve Storyboard'ları da kullanmak istiyorum, görsel olarak görmek istiyorum ve WWDC, storyboard'ların yeni Mac uygulamaları için en iyi uygulama olduğunu öne sürüyor, Lister iyi bir örnek.

Bir düğme oluşturabilir ve görünümler arasında bir segue hareketi yapabilirim ancak bir pop up, modal veya sayfa istemiyorum, ancak aslında görünümü değiştir (aynı pencerede kal). özel bir sek ya da programatik tek bir bağlantıdır, bu yüzden takılıyorum, Mac uygulamaları için bunu kapsayan pek çok basit öğretici yoktur, hepsi Storyboard'ları tartışırken iOS'a taşınır. Herkes bu benim ikinci ViewController oluşturduk iyi olurdu yardımcı olabilir ve bu onu desteklemek için Kod olduğunu düşünüyorsanız, ben örnekler farklı görünmektedir Yine nitelikler

import Cocoa 

class CreateEditView: NSViewController { 

    required init?(coder: (NSCoder!)) { 
     super.init(coder:coder) 
    } 

} 

benim ikinci viewController bu bağladıysanız fakat hızlı 2.2 olmayabilir (eğer bu kodun aslında ne yaptığını da herkes anlatabilir mi?)

cevap

1

Bu tür bir nesneyi Objective-C'de yaptım ama kolay değil ... kısıtlamalar doğrudur. Apple, görüntü denetleyicilerinin mutlaka kendi pencerelerine gereksinim duymadıklarını anlayana kadar kapsayıcı bir görünüm kullanmasını öneririm.

Bu örnekte, kapsayıcı görünümü ile ViewController'u kurdum ve bir FirstContained görüntü denetleyicisini film şeridinde ona bağladım. Bir "İleri" düğmesine sahiptir.

@IBAction func goToNext(sender: NSButton) { 
    NSNotificationCenter.defaultCenter().postNotificationName(ViewController.SecondController, object: nil) 
} 

Ben Film şeridinde bir SecondContained görünüm denetleyicisi oluşturmak ve bu tanımlayıcı "second_contained" verir. Bir "Geri" düğmesine sahiptir.

@IBAction func goBack(sender: NSButton) { 
    NSNotificationCenter.defaultCenter().postNotificationName(ViewController.FirstController, object: nil) 
} 

ViewController geçişleri için tüm çalışır. (Kısıtlamalar alma hakkı hala bazı çaba gerektirir unutmayın. SecondContained 'ın görünümünde sıkıştırma direncini azaltarak başlayın.)

import Cocoa 

class ViewController: NSViewController { 

    static let FirstController = "FirstController" 
    static let SecondController = "SecondController" 

    @IBOutlet weak var container: NSView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "firstSelected:", name: ViewController.FirstController, object: nil) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "secondSelected:", name: ViewController.SecondController, object: nil) 

     // This puts the "SecondContained" controller at location zero in the childViewControllers array. 
     let storyboard = NSStoryboard(name: "Main", bundle: nil) 
     let controller = storyboard.instantiateControllerWithIdentifier("second_contained") as? SecondContained 
     if let second = controller { 
      addChildViewController(second) 
     } 
    } 

    deinit { 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    func removePreviousView() { 
     if let oldView: NSView = container.subviews[0] { 
      oldView.removeFromSuperview() 
     } else { 
      print("No previous view found") 
     } 
    } 

    // This is a hack. 
    // It would be better to search for the controller by a reliable identifier rather than a number. 
    func useController(offset: Int) { 
     guard childViewControllers.count > offset else { 
      print("Bad offset \(offset) for \(childViewControllers.count)-long array") 
      return 
     } 
     if let controller: NSViewController = childViewControllers[offset] { 
      container.addSubview(controller.view) 
     } else { 
      print("No view controller!?") 
     } 
    } 

    func firstSelected(notification: NSNotification) { 
     removePreviousView() 
     useController(1) 
    } 

    func secondSelected(notification: NSNotification) { 
     removePreviousView() 
     useController(0) 
    } 

} 

Not bu 2.1 Swift olduğunu. Mantık taşınabilir olmalı ama bazı sözdiziminin değişip değişmediğini bilmiyorum.