2016-07-23 24 views
1

Ich habe eine MainViewController.swift und es ist mit einer Xib-Datei (MainViewController) verbunden. Der MainViewController ist mit einem MenuViewController.swift und seinem Xib (genannt MenuViewController) verbunden. Die Mainviewcontroller rufen die MenuViewContoller den folgenden Code verwenden,Swift - Wie lade ich eine XIB-Datei von einem View-Controller im Storyboard?

override func viewDidLoad() { 
    super.viewDidLoad() 
    ... 
    menuBtn.addTarget(self, action: #selector(callMenuModal), forControlEvents: .TouchUpInside) 
    .... 

} 
func callMenuModal() { 
    let menuVC = MenuViewController() 
    menuVC.delegate = self 
    menuVC.modalPresentationStyle = .OverCurrentContext 
    presentViewController(menuVC, animated: false, completion: nil) 
} 
....... 
func backFromMenu() { 
    self.dismissViewControllerAnimated(true, completion: nil) 
    } 
... 
... 

Meine Freunde ein Storyboard mit vielen Segues und Viewcontrollers gemacht haben.

Ich muss jetzt laden meine .xib-Datei und die entsprechende View-Controller, wenn eine Taste von einem ViewController auf der Storyboard gedrückt wird. Ich habe nach einer Lösung gesucht und konnte keine finden.

Zuvor habe ich meine Xib direkt von der AppDelegate aufgerufen, so dass ich nichts tun musste. Ich hatte nur eine View-Controller in der Storyboard und eine App Delegierter für die ganze App, der Code, den ich in den Delegaten verwendet wird, wie unten angegeben,

import UIKit 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    window = UIWindow(frame: UIScreen.mainScreen().bounds) 

    let mainViewController = MainViewController(nibName: "MainViewController", bundle: nil) 

    window?.rootViewController = mainViewController 
    window?.makeKeyAndVisible() 
    return true   
} 
........rest of app delegate.... 

Aber ich weiß nicht, wie die xib Datei laden , von einem anderen View-Controller im Storyboard oder einem Tastendruck (IBAction) von einem ViewController.

+0

Wenn Sie diese einfache Aufgabe nicht ausführen können, müssen Sie weitere [grundlegende Lernprogramme von Apple] lesen und verstehen. (Https://developer.apple.com/library/prerelease/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/) – Jeff

Antwort

1

es gelöst ... es direkt vor meinen Augen war, ich denke, die Frage stellen musste schreiben die Antwort selbst, haha, ich bin so schlau, ich habe diesen Code zum View-Controller vom Storyboard hinzugefügt und es funktioniert wie ein Zauber.

import UIKit 

class ViewController: UIViewController, communicationControllerM { 

    @IBOutlet weak var Btn: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     Btn.addTarget(self, action: #selector(callMenuModal), forControlEvents: .TouchUpInside) 
    } 

    func callMenuModal() { 
     let mainVC = MainViewController() 
     mainVC.delegate = self 
     mainVC.modalPresentationStyle = .OverCurrentContext 
     presentViewController(mainVC, animated: false, completion: nil) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func backFromM() { 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

in meinem xib View-Controller hinzugefügt ich eine Rückkehr Aktion

playBtn.addTarget(self, action: #selector(goBackToMainVC), forControlEvents: .TouchUpInside) 
self.delegate?.backFromM() 

Danke Jungs !!

+1

In Bezug auf Symbolnamen wie 'Btn' und' backFromM' empfehle ich Ihnen, die [Swift API Design Richtlinien für Abkürzungen] (https://swift.org/documentation/api-design-guidelines/#general-conventions) zu lesen. – Jeff

0

laden Sie einen View-Controller und die zugehörige Nib-Datei genau so, wie Sie es bereits im Code tun:

let mainViewController = MainViewController(nibName: "MainViewController", bundle: nil) 

, dass der View-Controller instanziiert, und wenn Sie es vorhanden oder schieben, wobei die Ansicht wird von der Spitze geladen und in die Schnittstelle eingefügt.

3

Sie können nicht direkt vom Storyboard zu Ihrem MainViewController überleiten. Aber Sie können es laden und anzeigen, so wie Sie es bei Ihrem App-Delegierten getan haben.

Wie möchten Sie MainViewController anzeigen? Schieben Sie es auf einen Navigationsstapel, präsentieren Sie es modal, etwas anderes? Ich gehe davon aus, dass Sie eine UINavigationController verwenden und Sie auf den Stapel schieben möchten.

In Ihrem UIViewController Klasse Freund, fügen Sie eine Methode zu laden und präsentieren Sie Ihre MainViewController:

func presentMainViewController() { 
    let mainVC = MainViewController(nibName:"MainViewController", bundle:nil) 
    self.navigationController.pushViewController(mainVC, true); 
    // you could present it another way, such as: 
    // self.presentViewController(mainVC, true, nil) 
    // to present it as a modal 
} 
+0

Vielen Dank;) Es funktioniert. –

0

Als Klassenvariable diese zuzuordnen:

var nibName: NibViewClass? 

Zuweisen zu der entsprechenden Klasse für die Spitze hergestellt.

Innerhalb der View-Controller, wo Sie die Spitze laden möchten, rufen Sie

nibName = NSBundle.mainBundle().loadNibNamed("NibView", owner: self, options: nil) as? NibViewClass 

Vergewissern Sie sich, dass die "NibView" == der Name der Nib UI-Datei. Dann müssen Sie es als ein Subview hinzufügen wie folgt:

if nibName != nil { 
    self.view.addsubview(nibName!) 

    //add this line to make it appear where you want it. 
    nibName.frame = CGRectMake(xPosition, yPositionOffScreen, nibWidth, nibHeight) 
} 

Nun ist diese für Sie die meiste Arbeit tun, aber ich würde empfehlen, es auch zu animieren. Es gibt ein paar verschiedene Möglichkeiten, dies zu tun, aber man mich oft benutzen ist wie so:

UIView.animateWithDuration(0.7, delay: 1.0, options: .CurveEaseIn, animations: { 
     nibName.frame.origin.y = yPositionOnScreen 
    }, completion: { finished in 
     //code to run after nib finishes movement 
    }) 

An jedem Punkt, nachdem Sie die nibName zu ihm entsprechende Klasse zuordnen, können Sie die lokalen Variablen aus Ihrem Viewcontroller zuweisen. Sie können die Spitze auch mit x-Positionen animieren, falls gewünscht. Ich würde die gleiche Funktion mit den y-Werten verwenden, die umgekehrt sind, um es zurück zu senden, wenn Sie damit fertig sind.