2016-07-23 4 views
1

У меня есть MainViewController.swift, и он подключен к файлу Xib (называемому MainViewController). MainViewController подключен к MenuViewController.swift и его Xib (называется MenuViewController). MainViewController называет MenuViewContoller, используя следующий код,Swift - как загрузить файл 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) 
    } 
... 
... 

Мои друзья сделали раскадровку с большим количеством перетекает и ViewControllers.

Теперь я должен загрузить мой .xib-файл и соответствующий ему контроллер представления при нажатии кнопки ViewController на панели рассказов. Я смотрел высоко и низко для решения и не мог найти его.

Раньше я называл свой xib непосредственно из AppDelegate, поэтому мне не нужно было ничего делать. У меня был только один регулятор вида в раскадровке и приложение делегат для всего приложения, код, который я использовал в делегате, как указано ниже,

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 , с другого контроллера представления в раскадровке или нажатия кнопки (IBAction) из ViewController.

+0

Если вы не можете выполнить эту простую задачу, вам необходимо прочитать и понять больше [основные учебные пособия, предоставляемые Apple.] (Https://developer.apple.com/library/prerelease/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/) – Jeff

ответ

1

решаемые ... это было прямо перед моими глазами, думаю, я должен был задать вопрос написать ответ сам, ха-ха, я такой умный, я добавил этот код в контроллер просмотра из доски объявлений, и он работает как шарм.

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

на мой взгляд XIB контроллер я добавил обратный действие

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

Спасибо, ребята !!

+1

Что касается имен таких символов, как 'Btn' и' backFromM', я рекомендую вам ознакомиться с инструкциями [Swift API Design о сокращениях] (https://swift.org/documentation/api-design-guidelines/#general-conventions). – Jeff

0

Вы загружаете контроллер представления и связанный с ним острием файл именно так, как вы уже делаете это в вашем коде:

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 

Убедитесь, что «NibView» == имя файла Nib UI. Затем вам нужно добавить его как подвид так:

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

В любой момент после того, как вы назначите nibName на это соответствующий класс, вы можете назначить свои локальные переменные внутри вашего ViewController. Вы также можете выбрать анимировать нить внутри с позициями x, если это необходимо. Я бы использовал ту же функцию, что и значения y, измененные назад, чтобы отправить их обратно на экран при выполнении с ним.

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