Как бы я быстро ссылался на основную раскадровку в своем приложении?

Как я буду ссылаться на основную раскадровку в своем приложении программно быстро? Я просмотрел делегат приложения для ссылки, но пока не нашел его.

Ответ 1

О, крики, я нашел ответ...

В другом виде контроллер, подключенный к раскадровке, вы можете просто использовать:

self.storyboard?

Ответ 2

Или любой объект может получить раскадровку, ссылаясь на его имя и комплект:

let storyboard = UIStoryboard(name: "storyboardNameHere", bundle: nil) //if bundle is nil the main bundle will be used

Ответ 3

Это легко. Когда я сталкивался с подобной проблемой, я написал класс, который может получить любые ресурсы из основного пакета.

//Generate name of the main storyboard file, by default: "Main"
var kMainStoryboardName: String {
    let info = NSBundle.mainBundle().infoDictionary!

    if let value = info["TPMainStoryboardName"] as? String
    {
        return value
    }else{
        return "Main"
    }
}

public class TPBundleResources
{
    class func nib(name: String) -> UINib?
    {
        let nib = UINib(nibName: name, bundle: NSBundle.mainBundle());
        return nib
    }

    //Main storybord
    class func mainStoryboard() -> UIStoryboard
    {
        return storyboard(kMainStoryboardName)
    }

    class func storyboard(name: String) -> UIStoryboard
    {
        let storyboard = UIStoryboard(name: name, bundle: NSBundle.mainBundle())
        return storyboard
    }

    //Obtain file from main bundle by name and fileType
    class func fileFromBundle(fileName: String?, fileType: String?) -> NSURL?
    {
        var url: NSURL?

        if let path = NSBundle.mainBundle().pathForResource(fileName, ofType: fileType)
        {
            url = NSURL.fileURLWithPath(path)
        }

        return url
    }

    class func plistValue(key:String) -> AnyObject?
    {
        let info = NSBundle.mainBundle().infoDictionary!

        if let value: AnyObject = info[key]
        {
            return value
        }else{
            return nil
        }
    }
}


public extension TPBundleResources
{
    //Obtain view controller by name from main storyboard
    class func vcWithName(name: String) -> UIViewController?
    {
        let storyboard = mainStoryboard()
        let viewController: AnyObject! = storyboard.instantiateViewControllerWithIdentifier(name)
        return viewController as? UIViewController
    }

    class func vcWithName(storyboardName:String, name: String) -> UIViewController?
    {
        let sb = storyboard(storyboardName)
        let viewController: AnyObject! = sb.instantiateViewControllerWithIdentifier(name)
        return viewController as? UIViewController
    }

    //Obtain view controller by idx from nib
    class func viewFromNib(nibName: String, atIdx idx:Int) -> UIView?
    {
        let view =  NSBundle.mainBundle().loadNibNamed(nibName, owner: nil, options: nil)[idx] as! UIView
        return view
    }

    class func viewFromNib(nibName: String, owner: AnyObject, atIdx idx:Int) -> UIView?
    {
        let bundle = NSBundle(forClass: owner.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        let view = nib.instantiateWithOwner(owner, options: nil)[idx] as? UIView
        return view
    }

    class func viewFromNibV2(nibName: String, owner: AnyObject, atIdx idx:Int) -> UIView?
    {
        let view =  NSBundle.mainBundle().loadNibNamed(nibName, owner: owner, options: nil)[idx] as! UIView
        return view
    }
}

Вот простые примеры:

//Get a main storyboard
TPBundleResources.mainStoryboard()

//Get view controller form main storyboard
TPBundleResources.vcWithName("MyViewController")

//Get view from MyView.nib at index 0
TPBundleResources.viewFromNib("MyView", atIdx: 0)

//Get plist value by key
TPBundleResources.plistValue("key")

Ответ 4

Даже если ответ @ManOfPanda верен, бывают случаи, когда вы просто не имеете ссылки на UIViewController, поэтому вы можете захватить его из rootViewController объекта UIWindow из вашего AppDelegate.

// First import your AppDelegate
import AppDelegate

// ...

// Then get a reference of it.
let appDelegate = UIApplication().shared.delegate as! AppDelegate

// From there, get your UIStoryboard reference from the
// rootViewController in your UIWindow
let rootViewController = appDelegate.window?.rootViewController
let storyboard = rootViewController?.storyboard

Вы также могли бы, конечно, просто создать UIStoryboard, используя (как предлагалось @Mario):

let storyboard = UIStoryboard(name: "storyboard", bundle:nil)

Но это, согласно документации Apple, создаст новый экземпляр раскадровки (даже если у вас уже есть одна работа). Я всегда предпочитаю использовать существующий экземпляр.

Init (имя: расслоение:)

Создает и возвращает объект раскадровки для указанного ресурса ресурса раскадровки.

init(name: String, bundle storyboardBundleOrNil: Bundle?)

Параметры

  • name: имя файла ресурса раскадровки без расширения имени файла. Этот метод вызывает исключение, если этот параметр равен нулю.
  • storyboardBundleOrNil: пакет, содержащий файл раскадровки и связанные с ним ресурсы. Если вы укажете nil, этот метод будет выглядеть в основном пакете текущего приложения.

Источник: документация по Apple

Ответ 5

UIStoryboard * mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];