Film şeridini sınıftan programlı olarak nasıl yükleyebilirim?


183

Benim sorunum ikisini de kullanmak yolu arıyordu olmasıdır film şeridi ve xib . Ancak film şeridini programlı olarak yüklemek ve göstermek için uygun bir yol bulamıyorum. Proje xib ile geliştirilmeye başlandı ve şimdi tüm xib dosyalarını film şeridine yerleştirmek çok zor. Bu yüzden alloc, init, pushviewControllers için olduğu gibi, kod yapmak için bir yol arıyordum. Benim durumumda, film şeridinde yalnızca bir denetleyicim var: UITableViewControllergöstermek istediğim bazı içeriğe sahip statik hücreler var. Kimse büyük refactoring olmadan hem xib hem de storyboard ile çalışmak için uygun bir yol biliyorsa, herhangi bir yardım için minnettar olacağım.

Yanıtlar:


370

Film şeridinizde Özellikler denetçisine gidin ve görünüm denetleyicisinin Tanımlayıcısını ayarlayın. Daha sonra bu görünüm denetleyicisini aşağıdaki kodu kullanarak sunabilirsiniz.

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];

65
[sb instantiateInitialViewController]sahnenin varsayılan görünüm denetleyicisinde başlamak istiyorsanız kullanışlıdır.
2012'de

James, teşekkür ederim! Bir Storyboard'un görüşünü nasıl canlandıracağımızı anlamaya çalışarak epey zaman arıyordum. Cevabınızı (ve kokoko'nun sorusunu) bulmak en ferahlatıcıdır.
bejonbee

James Beith'in kodunda UIViewControler * vc, geçerli viewcontroller ile ileri geri değiştirilirse yeniden kullanılmalıdır. Kullanıcı yeni görünümde bir düğmeye basana kadar vc'nin etrafına yapıştığını ve film şeridi ucuna bağlandığını zor yoldan öğrendim ve şimdi bu kodun önceki girişlerinden atılan vc ile bir bellek sızıntısı var.
SWoo

11
Herhangi birinin uygulama temsilcisinde bunu nasıl yapacağını bilmek isterse, [self presentViewcontroller]mantığı şu satırlarla şu sırayla değiştirirsiniz: 1) self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];2) self.window.rootViewController = vc;ve 3) [self.window makeKeyAndVisible];. Ayrıca, muhtemelen modalTransitionStyleuygulama delegesinden kalıcı bir geçiş olmadığı için bu satırdan da kurtulabilirsiniz .
lewiguez

FYI, modally patlatmak yerine yeni film şeridini "itmek" istiyorsanız, chaithraVeeresh'in cevabına bakın.
Adam Johns

76

Hızlı 3

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "viewController")
self.navigationController!.pushViewController(vc, animated: true)

Hızlı 2

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController")
self.navigationController!.pushViewController(vc, animated: true)

Önkoşul

Görünüm denetleyicinize bir Öykü Paketi Kimliği atayın .

Film şeridi kimliği

IB> Kimlik denetçisini göster> Kimlik> Storyboard Kimliği

Swift (eski)

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController
self.navigationController!.pushViewController(vc!, animated: true)

Düzenleme: Swift 2 Fred A. tarafından yorumda önerildi

herhangi bir navigationController olmadan kullanmak istiyorsanız, aşağıdaki gibi kullanmanız gerekir:

    let Storyboard  = UIStoryboard(name: "Main", bundle: nil)
    let vc = Storyboard.instantiateViewController(withIdentifier: "viewController")
    present(vc , animated: true , completion: nil)

1
Swift 2'de, "UIViewController" olarak eklemenize gerek yoktur, derleyici bunu otomatik olarak belirler
Frédéric Adda

2
ya da self.storyboardline1 & 2
Honey

17

Özellik denetçisinde bu görünüm denetleyicisinin tanımlayıcısını verin ve aşağıdaki kod benim için çalışıyor

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
[self.navigationController pushViewController:detailViewController animated:YES];

5

Bunu dene

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"];

[[UIApplication sharedApplication].keyWindow setRootViewController:vc];

Diğer yanıtlarda gösterildiği gibi bir UINavigationController kullanmıyorsanız bunu kullanın
latenitecoder

2

swift
NavigationController ve pushController içinde değiştirebilirsiniz

present(vc, animated:true , completion: nil)

1

İçin Swift 3. ve 4. , bunu yapabilirsin. İyi uygulama, Storyboard adının StoryboardID değerine eşit olarak ayarlanmasıdır.

enum StoryBoardName{
   case second = "SecondViewController"
}
extension UIStoryBoard{
   class func load(_ storyboard: StoryBoardName) -> UIViewController{
      return UIStoryboard(name: storyboard.rawValue, bundle: nil).instantiateViewController(withIdentifier: storyboard.rawValue)
   }
}

ve sonra Storyboard'unuzu ViewController'ınıza şu şekilde yükleyebilirsiniz:

class MyViewController: UIViewController{
     override func viewDidLoad() {
        super.viewDidLoad()
        guard let vc = UIStoryboard.load(.second) as? SecondViewController else {return}
        self.present(vc, animated: true, completion: nil)
     }

}

Yeni bir Storyboard oluşturduğunuzda StoryboardID'de aynı adı ayarlamanız ve " StoryBoardName " numaranıza Storyboard adını eklemeniz yeterlidir


0

Her zaman doğrudan kök denetleyicisine atlayabilirsiniz:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateInitialViewController];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];

0

Aşağıdaki uzantı a'yı yüklemenize izin verir Storyboardve ilişkilendirilir UIViewController. Örnek: Bir varsa UIViewControlleradlandırılmış ModalAlertViewControllerve bir film şeridi "ModalAlert" adlı örn

let vc: ModalAlertViewController = UIViewController.loadStoryboard("ModalAlert")

Her iki yükleyecektir Storyboardve UIViewControllerve vctip olacaktır ModalAlertViewController. Not Film şeridinin Film şeridi kimliğinin film şeridiyle aynı ada sahip olduğunu ve film şeridinin Başlangıç ​​Görünümü Denetleyici olarak işaretlendiğini varsayar .

extension UIViewController {
    /// Loads a `UIViewController` of type `T` with storyboard. Assumes that the storyboards Storyboard ID has the same name as the storyboard and that the storyboard has been marked as Is Initial View Controller.
    /// - Parameter storyboardName: Name of the storyboard without .xib/nib suffix.
    static func loadStoryboard<T: UIViewController>(_ storyboardName: String) -> T? {
        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        if let vc = storyboard.instantiateViewController(withIdentifier: storyboardName) as? T {
            vc.loadViewIfNeeded() // ensures vc.view is loaded before returning
            return vc
        }
        return nil
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.