43

私のアプリではUIWindow、メインの UIWindow の上に新しいものを作成したいので、次のように書きましたが、機能しません。まず、メイン ウィンドウとして a を作成し、UIWindowそれをキーにして表示し、新しいUIWindowオーバーレイを作成しますが、何も起こりません。

- (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;
}
4

10 に答える 10

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

最後に、window1 はメソッド var であり、メソッドの実行後に失われるため、機能しない理由がわかりました。そのため、新しい @property を次のように宣言します。

@property (strong, nonatomic) UIWindow *window2;

コードを次のように変更します

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

できます!

于 2013-11-15T08:31:17.240 に答える
9

window1オブジェクトはローカル変数です。コードがこのメソッドを使い果たすと、このオブジェクトはもう存在しません。作成したすべてUIWindowのオブジェクトは に追加されますが[[UIApplication sharedApplication] windows]、この配列は任意のUIWindowオブジェクトへの弱参照のみを保持するため、window オブジェクトの存在を維持するのは独自のコード次第です。Appleがこのように実装した理由は、アプリが実行されている限りオブジェクトが存在するためであり、しばらくの間存在する必要があるオブジェクトを「永遠に」メモリに[UIApplication sharedApplication]保持することを避けるためだと思います。UIWindow

さらに、コードは MRC で実行できます。

于 2015-01-27T06:16:59.413 に答える
3

スイフト4

メモリ リークを避けるために、Apple の提案に従って、この方法でカスタム ウィンドウを初期化することを好みます。

アプリにカスタム ウィンドウを提供する場合は、このプロパティの getter メソッドを実装し、それを使用してカスタム ウィンドウを作成して返す必要があります。

例:

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()
}
于 2018-09-26T20:57:10.800 に答える
-1

Swift では、次のように新しいUIWindowものを追加できます。

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var viewController: ViewController?
    var navigationController: UINavigationController?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.viewController = ViewController(nibName: "ViewController", bundle:NSBundle.mainBundle())
        self.navigationController = UINavigationController(rootViewController: self.viewController!)
        self.window!.rootViewController = self.navigationController
        //  self.window!.addSubview(self.viewController!.view)
        self.window!.makeKeyAndVisible()
        return true
    }

    //Other methods..
}
于 2015-04-20T09:22:53.000 に答える