2016-03-30 4 views
1

Я очень новичок в Swift и хотя имею некоторые знания в области программирования и смотрел материал Udemy и Lynda на код Swift. Я немного стараюсь переместиться с игровой площадки на Проект Xcode.Раскадровки и Swift 2.2 Mac App custom segue заменить контроллер просмотра

Я также хотел бы создать приложение для Mac, которое затрудняет поиск учебников.

Я хочу использовать новейшие Swift и раскадровки тоже, я хочу, чтобы визуализировать это, и WWDC предлагает раскадровки - лучшая практика для новых приложений Mac, Lister - хороший пример.

Я могу с радостью создать кнопку и использовать переключение между видами, но не хочу всплывать, модально или листать, но на самом деле заменить вид (ака остаться в том же окне), поэтому я предполагаю, что это это индивидуальное соединение или программное единственное соединение, в котором я застрял, не так много простых преподавателей, которые охватывают это для приложений Mac, все они переходят в iOS при обсуждении раскадровки. Если кто-то может помочь, что было бы здорово, я создал мой второй ViewController, и я считаю, что это код, чтобы поддержать его, я подключил это мой второй ViewController в атрибутах

import Cocoa 

class CreateEditView: NSViewController { 

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

} 

Опять примеры кажутся разными, но может не быть быстрым 2.2 (если кто-то может также объяснить, что делает этот код на самом деле, это также было бы замечательно)

ответ

1

Я сделал пользовательский segue этого типа в Objective-C, но это непросто ... и получение ограничения права хуже. Пока Apple не выяснит, что контроллеры представлений не обязательно нуждаются в собственных окнах, я предлагаю использовать представление контейнера.

В этом примере я установил ViewController с видом на контейнер и связал FirstContained контроллер просмотра с ним в раскадровке. Он имеет кнопку «Далее».

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

создать контроллер с SecondContained вида в раскадровке и дать ему идентификатор «second_contained». Он имеет кнопку «Назад».

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

ViewController делает всю работу для переходов. (Обратите внимание, что получение ограничений права все еще требуется некоторое усилие. Начните с уменьшением сопротивления сжатия ввиду SecondContained «s.)

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) 
    } 

} 

Обратите внимание, что это Swift 2.1. Логика должна быть переносимой, но я не знаю, изменился ли какой-либо синтаксис.

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