ios doc - Instancier et présenter un viewController dans Swift




documentation logo (9)

// "Main" is name of .storybord file "
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// "MiniGameView" is the ID given to the ViewController in the interfacebuilder
// MiniGameViewController is the CLASS name of the ViewController.swift file acosiated to the ViewController
var setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MiniGameView") as MiniGameViewController
var rootViewController = self.window!.rootViewController
rootViewController?.presentViewController(setViewController, animated: false, completion: nil)

Cela a bien fonctionné pour moi quand je l'ai mis dans AppDelegate

Problème

J'ai commencé à regarder le nouveau Swift sur Xcode 6 , et j'ai essayé quelques projets de démonstration et des tutoriels. Maintenant je suis coincé à:

Instanciation et présentation d'un viewController partir d'un storyboard spécifique

Solution Objective-C

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"myVCID"];
[self presentViewController:vc animated:YES completion:nil];

Comment réaliser cela sur Swift?


Réponse d'Akashivskyy fonctionne très bien! Mais, au cas où vous auriez du mal à revenir du contrôleur de vue présenté, cette alternative peut être utile. Cela a fonctionné pour moi!

Rapide:

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! UIViewController
// Alternative way to present the new view controller
self.navigationController?.showViewController(vc, sender: nil)

Obj-C:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"someViewController"];
[self.navigationController showViewController:vc sender:nil];

Si vous voulez le présenter de manière modale, vous devriez avoir quelque chose comme:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewControllerID")
self.showDetailViewController(vc as! YourViewControllerClassName, sender: self)

Je sais que c'est un vieux fil, mais je pense que la solution actuelle (en utilisant l'identificateur de chaîne codée en dur pour le contrôleur de vue donné) est très sujette aux erreurs.

J'ai créé un script de temps de construction (auquel vous pouvez accéder ici ), qui créera un compilateur sécurisé pour accéder et instancier les contrôleurs de vue de tous les storyboards du projet.

Par exemple, le contrôleur de vue nommé vc1 dans Main.storyboard sera instancié comme suit :

let vc: UIViewController = R.storyboard.Main.vc1^  // where the '^' character initialize the controller

Pour les personnes utilisant la réponse de @ akashivskyy pour instancier UIViewController et qui ont l'exception:

Erreur fatale: utilisation de l'initialiseur 'init (coder :)' non implémenté pour la classe

Conseil rapide:

required init?(coder aDecoder: NSCoder) manuellement required init?(coder aDecoder: NSCoder) à votre UIViewController destination que vous essayez d'instancier

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

Si vous avez besoin de plus de description s'il vous plaît se référer à ma réponse here


Peu importe ce que j'ai essayé, ça ne marcherait pas pour moi - pas d'erreurs, mais pas de nouveau contrôleur de vue sur mon écran non plus. Je ne sais pas pourquoi, mais l'emballer dans la fonction de temporisation a finalement fait fonctionner:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.0) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "TabletViewController")
    self.present(controller, animated: true, completion: nil)
}

Si vous avez un Viewcontroller n'utilisant pas de storyboard / Xib, vous pouvez pousser vers ce VC particulier comme ci-dessous:

 let vcInstance : UIViewController   = yourViewController()
 self.present(vcInstance, animated: true, completion: nil)

Swift 3

let settingStoryboard : UIStoryboard = UIStoryboard(name: "SettingViewController", bundle: nil)
let settingVC = settingStoryboard.instantiateViewController(withIdentifier: "SettingViewController") as! SettingViewController
self.present(settingVC, animated: true, completion: {

})

À partir du The Swift Programming Language :

La bibliothèque standard de Sort Function Swift fournit une fonction appelée sort, qui trie un tableau de valeurs d'un type connu, en fonction de la sortie d'une fermeture de tri que vous fournissez. Une fois le processus de tri terminé, la fonction de tri renvoie un nouveau tableau du même type et de la même taille que l'ancien, avec ses éléments dans l'ordre trié correct.

La fonction de sort a deux déclarations.

La déclaration par défaut qui vous permet de spécifier une fermeture de comparaison:

func sort<T>(array: T[], pred: (T, T) -> Bool) -> T[]

Et une deuxième déclaration qui ne prend qu'un seul paramètre (le tableau) et est "codé en dur pour utiliser le comparateur inférieur".

func sort<T : Comparable>(array: T[]) -> T[]

Example:
sort( _arrayToSort_ ) { $0 > $1 }

J'ai testé une version modifiée de votre code dans une cour de récréation avec la fermeture ajoutée afin que je puisse surveiller la fonction un peu plus près, et j'ai trouvé qu'avec n réglé sur 1000, la fermeture était appelée environ 11 000 fois.

let n = 1000
let x = Int[](count: n, repeatedValue: 0)
for i in 0..n {
    x[i] = random()
}
let y = sort(x) { $0 > $1 }

Ce n'est pas une fonction efficace, je recommanderais d'utiliser une meilleure implémentation de la fonction de tri.

MODIFIER:

J'ai jeté un oeil à la page Quicksort wikipedia et j'ai écrit une implémentation Swift pour cela. Voici le programme complet que j'ai utilisé (dans un terrain de jeu)

import Foundation

func quickSort(inout array: Int[], begin: Int, end: Int) {
    if (begin < end) {
        let p = partition(&array, begin, end)
        quickSort(&array, begin, p - 1)
        quickSort(&array, p + 1, end)
    }
}

func partition(inout array: Int[], left: Int, right: Int) -> Int {
    let numElements = right - left + 1
    let pivotIndex = left + numElements / 2
    let pivotValue = array[pivotIndex]
    swap(&array[pivotIndex], &array[right])
    var storeIndex = left
    for i in left..right {
        let a = 1 // <- Used to see how many comparisons are made
        if array[i] <= pivotValue {
            swap(&array[i], &array[storeIndex])
            storeIndex++
        }
    }
    swap(&array[storeIndex], &array[right]) // Move pivot to its final place
    return storeIndex
}

let n = 1000
var x = Int[](count: n, repeatedValue: 0)
for i in 0..n {
    x[i] = Int(arc4random())
}

quickSort(&x, 0, x.count - 1) // <- Does the sorting

for i in 0..n {
    x[i] // <- Used by the playground to display the results
}

En utilisant cela avec n = 1000, j'ai trouvé que

  1. quickSort () a été appelé environ 650 fois,
  2. environ 6000 swaps ont été faits,
  3. et il y a environ 10 000 comparaisons

Il semble que la méthode de tri intégrée est (ou est proche de) tri rapide, et est vraiment lente ...







ios objective-c swift uiviewcontroller