web-dev-qa-db-fra.com

Pour créer une nouvelle fenêtre d'interface utilisateur sur la fenêtre principale

Dans mon application, je veux créer un nouveau UIWindow sur la principale UIWindow, et j'ai écrit comme suit, mais cela ne fonctionne pas. tout d'abord, je crée un UIWindow comme fenêtre principale, puis je le rend clé et visible, puis je crée une nouvelle superposition UIWindow, mais rien ne se passe.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor redColor];
    ViewController *vc = [[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = vc;
    [self.window makeKeyAndVisible];
    UIWindow *window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
    window1.backgroundColor = [UIColor redColor];
    window1.windowLevel = UIWindowLevelAlert;
    [window1 makeKeyAndVisible];
    return YES;
}
32
bohan
UIWindow *window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
window1.backgroundColor = [UIColor redColor];
window1.windowLevel = UIWindowLevelAlert;
[window1 makeKeyAndVisible];

Enfin, je sais pourquoi cela ne fonctionne pas, car window1 est une méthode var, et il sera perdu après l'exécution de la méthode. Je déclare donc un nouveau @property pour cela, comme

@property (strong, nonatomic) UIWindow *window2;

et changer le code comme

UIWindow *window2 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 80, 320, 320)];
window2.backgroundColor = [UIColor redColor];
window2.windowLevel = UIWindowLevelAlert;
self.window2 = window2;
[window2 makeKeyAndVisible];

ça marche!

58
bohan

Xcode 8 + Swift

class ViewController: UIViewController {
    var coveringWindow: UIWindow?

    func coverEverything() {
        coveringWindow = UIWindow(frame: (view.window?.frame)!)

        if let coveringWindow = coveringWindow {
            coveringWindow.windowLevel = UIWindowLevelAlert + 1
            coveringWindow.isHidden = false
        }
    }
}

Selon la documentation , pour recevoir des événements qui n'ont pas de valeur de coordonnée pertinente, comme une entrée au clavier, faites-le key au lieu de simplement !isHidden:

coveringWindow.makeKeyAndVisible()

Vous pouvez même contrôler la transparence de son arrière-plan, pour un effet de fumée:

coveringWindow.backgroundColor = UIColor(white: 0, alpha: 0.5)

Notez qu'une telle fenêtre doit gérer les changements d'orientation.

11
SwiftArchitect

Votre window1 objet est une variable locale, lorsque le code manque de cette méthode, cet objet n'existe plus. Tout objet UIWindow que nous avons créé sera ajouté à [[UIApplication sharedApplication] windows], mais ce tableau ne conserve qu'une référence hebdomadaire à tout objet UIWindow, il appartient donc à votre propre code de conserver l'objet window. Pourquoi Apple réalisé comme ceci, Je suppose que c'est [UIApplication sharedApplication] l'objet existe aussi longtemps que l'application s'exécute, afin d'éviter de garder les objets UIWindow qui ne doivent exister que pendant un certain temps en restant "pour toujours" dans la mémoire.

De plus, votre code pourrait fonctionner avec MRC.

8
YuLong Xiao

Swift 4

Pour éviter les fuites de mémoire, je préfère initialiser ma fenêtre personnalisée de cette manière, comme proposé par Apple:

Si vous souhaitez fournir une fenêtre personnalisée pour votre application, vous devez implémenter la méthode getter de cette propriété et l'utiliser pour créer et renvoyer votre fenêtre personnalisée.

Exemple:

var myCustomWindow: UIWindow? = CustomWindow(frame: UIScreen.main.bounds)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let mainController: MainViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! MainViewController
    self.myCustomWindow?.rootViewController = mainController
    self.myCustomWindow?.makeKeyAndVisible()
}
2
user6618855

essayez d'ajouter un UIView sur la fenêtre principale pas un autre UIWindow comme ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor redColor];
    ViewController *vc = [[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = vc;
    [self.window makeKeyAndVisible];
    UIView * viewAlert = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
    viewAlert.backgroundColor = [UIColor redColor];
    [self.window.rootViewController.view addSubView:viewAlert];
    /* or you can use following..
    [self.window addSubView:viewAlert];
    */
    [viewAlert release]; //FOR NON ARC
    return YES;
}
0
Nirav Gadhiya