2016-07-23 7 views
1

私はMainViewController.swiftを持っていて、Xibファイル(MainViewControllerという)に接続しています。 MainViewControllerは、MenuViewController.swiftおよびそのXib(MenuViewController)に接続されています。 MainViewControllerはスウィフト - ストーリーボードのビューコントローラーからxibファイルをロードする方法は?

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

私の友人はSeguesとViewControllersの多くのストーリーボードを作ってきた、次のコードを使用してMenuViewContollerを呼び出します。

ストーリーボードのViewControllerからボタンを押したときに、.xibファイルとそれに対応するView Controllerをロードする必要があります。私は解決策のために高低に見えてきており、解決策を見つけることができませんでした。

以前私はAppDelegateから直接xibを呼び出したので、何もする必要はありませんでした。私は

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.... 

、下記のように私は、デリゲートで使用されるコードは、アプリケーション全体のために一つだけのストーリーボードのビューコントローラとアプリデリゲートを持っていたしかし、私はそのXIBファイルをロードする方法がわかりませんストーリーボード内の別のビューコントローラから、またはViewControllerからボタンを押して(IBAction)

+0

この簡単な作業を行うことができない場合は、さらに[Appleが提供する基本的なチュートリアル]を読み、理解する必要があります。(https://developer.apple.com/library/prerelease/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/) – Jeff

答えて

1

が、それは右の私の目の前にあった...それを解決私が書くために質問をしなければならなかったと思います私はとてもスマートです。私はこのコードをストーリーボードからビューコントローラに追加しました。それは魅力的なものです。私XIBビューコントローラで

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

私は帰りのアクション

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

みんなありがとうを追加しました!!

+1

'Btn'や' backFromM'のようなシンボル名については、[Swift API Design Guidelines for Abbreviations](https://swift.org/documentation/api-design-guidelines/#general-conventions)を読むことをお勧めします。 – Jeff

0

あなたはすでにあなたのコードでそれをやっている正確な方法ビューコントローラとそれに関連するnibファイルをロードします。

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

ビューコントローラをインスタンス化し、そしてときあなたが現在またはそれにプッシュ、ビューペン先からロードされ、インタフェースに配置されます。

3

ストーリーボードから直接MainViewControllerにアクセスすることはできません。しかし、アプリケーションデリゲートと同じように、読み込んで表示することができます。

どうやってMainViewControllerを表示しますか?それをナビゲーションスタックにプッシュし、モーダルで提示します。私はあなたがUINavigationControllerを使用していると仮定し、それをスタックにプッシュしたいと思います。あなたの友人のUIViewControllerクラスで

、ロードして提示する方法を追加するには、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

ありがとうございます;)うまくいきます。 –

0

クラス変数としてこれを割り当てる:

var nibName: NibViewClass? 

は、ペン先のために作られた対応するクラスに割り当てます。あなたはペン先をロードしたいところはどこでも、

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

を呼び出すビューコントローラ内部

は必ずペン先UIファイルの名前==「NibView」ことを確認してください。そして、あなたがそうのようなサブビューとして追加する必要があります。

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

さて、これはあなたのための作業のほとんどを行いますが、私は同様にそれをアニメーション化をお勧めします。そこそうするには、いくつかの異なる方法がありますが、私は頻繁に使用するものはそうのようなものです:

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

任意の時点で、あなたはそれが対応するクラスです、あなたはViewControllerを内側からそのローカル変数を割り当てることができますにnibNameを割り当てた後。また、x位置でペン先にアニメーションを付けることもできます。私はy値を逆にして同じ関数を使用して、それをオフスクリーンに戻します。

関連する問題