Soru Sadece Swift kullanarak yeni bir görünüm denetleyicisine nasıl geçiş yapılır


Kullanıcı bir UIButton'a bastığında ViewController'dan secondViewController'a geçiş yapmak istiyorum.

//Function to transition
func transition(Sender: UIButton!)
{   
    //Current Code, default colour is black
    let secondViewController:UIViewController = UIViewController()
    self.presentViewController(secondViewController, animated: true, completion: nil)

 }

44
2018-06-11 15:37


Menşei


Çalışmıyor mu? Size bir hata mı veriyor? Denedin mi self.presentViewController(...)? - Jack
İkinciViewController'a değiştirmeyi denediğimde siyah ekran almaya devam ediyorum, ancak hata oluşmuyor. Onları iki farklı .swift dosyada bulundurmam gerçektir. Yani ana ilk kontrolör ViewController.swift ve ikincisi secondViewController.swift içinde mi? - Stephen Fox
Gerçekte kullandığınız kodu size siyah ekranı gösteren kodu gösterin. - rdelmar
Bunu gerçekten nasıl uyguluyorsunuz? Burada yazılan yol, presentViewController işlevinin bir açıklamasına benziyor. Bu gibi görünmeli gibi görünüyor self.presentViewController(self.secondViewController, true, nil) veya benzeri. - Stakenborg
Siyah ekrana sahip olduğum kod: self.presentViewController (secondViewController, canlandırılmış: true, completion: nil) - Stephen Fox


Cevaplar:


Sorun, kodunuzun bir SecondViewController değil, boş bir UIViewController oluşturmasıdır. Alt sınıfınızın bir örneğini oluşturmanız gerekir, UIViewController değil,

func transition(Sender: UIButton!) {   
    let secondViewController:SecondViewController = SecondViewController()

    self.presentViewController(secondViewController, animated: true, completion: nil)

 }

SecondViewController sınıfınızda init (nibName nibName: String!, Bundle nibBundle: NSBundle!) Seçeneğini geçersiz kılarsanız, kodu değiştirmeniz gerekir.

let sec: SecondViewController = SecondViewController(nibName: nil, bundle: nil)

54
2018-06-11 16:09



Swift 3'ü kullananlar için "presentViewController" sadece "mevcut" olarak değişir. Her şey aynı kalır - Micah Montoya
Bu kodu kullanmanın bir yolu var ama açılan ViewController'da "geri düğmesi" gösterilsin mi? - JCarlos
@JCarlos, geri düğmesi bir NavigationController ile gelen bir şey. Görünümlerinizi navigasyon kontrol cihazının dizi kontrolörlerine gömmeniz gerekir ve sizin için bir geri düğmesi sağlar ve geçişini yönetir. - ScottyBlades


Bu benim için mükemmel çalıştı:

func switchScreen() {
    let mainStoryboard = UIStoryboard(name: "Storyboard", bundle: NSBundle.mainBundle())
    let vc : UIViewController = mainStoryboard.instantiateViewControllerWithIdentifier("vcMainLogin") as UIViewController
    self.presentViewController(vc, animated: true, completion: nil)
}

33
2018-06-22 09:45



Bu cevap, ayrılmış hikaye tahtaları için çalışır. - Jonathan Solorzano


SWIFT

Genellikle normal geçiş için kullanırız,

let next:SecondViewController = SecondViewController()
self.presentViewController(next, animated: true, completion: nil)

Ancak bazen navigasyon kontrol cihazını kullanırken, siyah ekran. Bu durumda,

let next:ThirdViewController = storyboard?.instantiateViewControllerWithIdentifier("ThirdViewController") as! ThirdViewController
self.navigationController?.pushViewController(next, animated: true)

Ayrıca, yukarıdaki çözümlerden hiçbiri film şeridinden veya tek bir xib'den başka bir xib'e çağrı yaptığınızda navigasyon çubuğunu korumaz. Eğer nav bar kullanıyorsanız ve onu normal itme gibi korumak istiyorsanız, kullanmak zorundasınız.

Diyelim ki, "MyViewController" MyViewController için tanımlayıcıdır

let viewController = MyViewController(nibName: "MyViewController", bundle: nil)
self.navigationController?.pushViewController(viewController, animated: true)

11
2018-04-22 06:40



Neden boş çıkıyor? Peki neden bunu kullanmalıyız? - Rohit Tigga
Benim Hikaye Kurulu giriş noktası basit bir UIViewController ve ben viewDidLoad () yazmak için deneyin: self.navigationController? .PushViewController (viewController, canlandırılmış: true) sonra self.navigationController? her zaman sıfırdır, dolayısıyla geçiş olmaz. Herhangi bir yardım için minnettar olurum. - Maxim
@Maxim, ilk görüş kontrol cihazınızı bir navigasyon kontrol cihazına yerleştirmelisiniz. Aksi takdirde her zaman sıfırlanır. Yerleştirmek için Seç InitViewController -> Editor -> Embed In -> Navigation Controller. - Sazzad Hissain Khan
Hi @SazzadHissainKhan ne demek istediniz "Ayrıca, yukarıdaki çözümlerden hiçbiri film şeridini veya tek bir xib'i başka bir xib'e çağırdığınızda navigasyon çubuğunu korumaz." - LShi
Anladım. VC'leri Storyboard'da var; Yani, eşyalarınızın bir combo çalıştı. Mine, UISegmentControl içinde gömülü VC'den başlatıldı: bir sonraki: VCAutoPayments = storyboard? .İnstantiateViewController (withIdentifier: "VCAutoPayments") olarak! VCAutoPayments self.present (sonraki, canlandırılmış: true, completion: nil) bkz. stackoverflow.com/questions/51105728/... - codeslapper


Kodun iyi. Siyah ekrana sahip olmanızın nedeni, ikinci görüş kontrol cihazınızda hiçbir şey olmamasıdır.

Şunun gibi bir şey deneyin:

secondViewController.view.backgroundColor = UIColor.redColor();

Şimdi gösterdiği görüntü denetleyici kırmızı olmalıdır.

Aslında bir şey yapmak secondViewControllerbir alt sınıf oluşturmak UIViewController ve yerine

let secondViewController:UIViewController = UIViewController()

ikinci görünüm kontrol cihazınızın bir örneğini oluşturmak için:

//If using code
let secondViewController = MyCustomViewController.alloc()

//If using storyboard, assuming you have a view controller with storyboard ID "MyCustomViewController"
let secondViewController = self.storyboard.instantiateViewControllerWithIdentifier("MyCustomViewController") as UIViewController

9
2018-06-11 16:02



Evet, bu işe yaradı, ancak geçişin gerçekleşmesinden sonra yeni bir .swift dosyasında yeni ViewController için bu kodu uygulamak için bir yol var mı? Böylece yeni dosyada UITextFields ve UILabels vb. Yapabilir miyim? - Stephen Fox
Cevabımı güncelledi. - Lord Zsolt


Bir .xib dosyasında bir storyboard ile ikinci bir görünüm denetleyicisi kullananlar için, kurucunuzdaki .xib dosyasının adını kullanmak isteyeceksiniz (.xib soneki olmadan).

let settings_dialog:SettingsViewController = SettingsViewController(nibName: "SettingsViewController", bundle: nil)
self.presentViewController(settings_dialog, animated: true, completion: nil)

3
2017-08-26 20:45



Teşekkürler. Bu benim için çalıştı - Luis Valdés
Duyduğuma sevindim! - DaveUT


İOS8'de bunu yapan herkes için yapmam gereken şey bu:

Hızlı bir sınıf dosyası var SettingsView.swift ve bir .xib adlı dosya SettingsView.xib. Bunu ben yönetiyorum MasterViewController.swift (ya da herhangi bir görüntü denetleyicisi gerçekten ikinci bir görüntü denetleyicisini açmak için)

@IBAction func openSettings(sender: AnyObject) {
        var mySettings: SettingsView = SettingsView(nibName: "SettingsView", bundle: nil) /<--- Notice this "nibName" 
        var modalStyle: UIModalTransitionStyle = UIModalTransitionStyle.CoverVertical
        mySettings.modalTransitionStyle = modalStyle
        self.presentViewController(mySettings, animated: true, completion: nil)

    }

2
2017-11-29 06:40





Swift 2.0'da şu yöntemi kullanabilirsiniz:

    let registrationView = LMRegistration()
    self.presentViewController(registrationView, animated: true, completion: nil)

2
2018-01-25 15:57





Her zaman nibName dosyasını kullanın, önceden yüklenmiş Xib içeriğiniz gösterilmez.

vc : ViewController =  ViewController(nibName: "ViewController", bundle: nil) //change this to your class name

 self.presentViewController(vc, animated: true, completion: nil)

1
2018-05-24 03:26





Swift 3 için güncellendi, bu cevapların bazıları biraz modası geçmiş.

let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        let vc : UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "myStoryboardID") as UIViewController
        self.present(vc, animated: true, completion: nil)    }

1
2018-06-13 21:49