Как я буду ссылаться на основную раскадровку в своем приложении программно быстро? Я просмотрел делегат приложения для ссылки, но пока не нашел его.
Как бы я быстро ссылался на основную раскадровку в своем приложении?
Ответ 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, этот метод будет выглядеть в основном пакете текущего приложения.
Ответ 5
UIStoryboard * mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];