Da ich kein Feedback für diese erhalten haben und ich es herausfinden, wie dies zu tun. Hier ist die Antwort.
Um zu steuern, welche Ansicht laden ich loadView
Methode von UIViewController
Lebenszyklus. Diese Methode wird ausgelöst, wenn die Anwendung zuerst die view
-Eigenschaft von UIViewController
abrufen muss. Also das ist faules Laden. Diese Methode wird auch ausgelöst, wenn der Benutzer loadViewIfNeeded()
von UIViewController
API aufruft. Im Körper dieser Methode müssen Sie sehr vorsichtig sein, view
Eigenschaft nicht zu lesen, weil dies loadView
wieder aufruft und Sie rekursive Schleife haben werden.
Meine Implementierung für diese Methode folgt. Ich muss sagen, ob der Benutzer angemeldet ist oder nicht, in der App enthalten und basierend darauf wählen Sie, welche Ansicht geladen werden soll.
override func loadView() {
// check in shared Keychain if user is authenticated
self.userAuthenticated = userService.isAuthenticated()
if self.userAuthenticated {
// load default view of the ShareViewController
super.loadView()
} else {
// if user is not logged in show only alert view controller with transparent dummy view
let view = UIView()
self.view = view
}
}
Und wenn der Benutzer angemeldet ist, nicht in I in
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let context = self.extensionContext!
if !self.userAuthenticated {
let alert = UIAlertController(title: "Error", message: "User not logged in", preferredStyle: .alert)
let cancel = UIAlertAction(title: "Cancel", style: .cancel) { _ in
context.completeRequest(returningItems: nil, completionHandler: nil)
}
let login = UIAlertAction(title: "Log In", style: .default, handler: { _ in
let url = URL(string: "fashionapp://login")!
// This is utility method written in Objective-C.
// I don't know yet if it passes Apple Review process or not.
// We will see ;)
self.open(url, options: [:], completionHandler: nil)
context.completeRequest(returningItems: nil, completionHandler: nil)
})
alert.addAction(cancel)
alert.addAction(login)
present(alert, animated: true, completion: nil)
}
}
Alarm zeigen Und hier ist das Verfahren zum Öffnen von Aktien Erweiterung enthält App. Ich hoffe, es wird nützlich sein und Apple wird dies ohne Probleme überprüfen. Es ist in Objective-C
geschrieben, da in Swift
gibt es keine NSInvocation
Klasse, so dass Sie nur Selektoren mit maximal zwei Argumente ausführen können.
#import <UIKit/UIKit.h>
@interface UIViewController (OpenURL)
- (void)openURL:(nonnull NSURL *)url
options:(nonnull NSDictionary<NSString *, id> *)options
completionHandler:(void (^ __nullable)(BOOL success))completion;
@end
Und Implementierung.
#import "UIViewController+OpenURL.h"
@implementation UIViewController (OpenURL)
- (void)openURL:(nonnull NSURL *)url
options:(nonnull NSDictionary<NSString *, id> *)options
completionHandler:(void (^ __nullable)(BOOL success))completion {
SEL selector = NSSelectorFromString(@"openURL:options:completionHandler:");
UIResponder* responder = self;
while ((responder = [responder nextResponder]) != nil) {
if([responder respondsToSelector:selector] == true) {
NSMethodSignature *methodSignature = [responder methodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
[invocation setTarget: responder];
[invocation setSelector: selector];
[invocation setArgument: &url atIndex: 2];
[invocation setArgument: &options atIndex:3];
[invocation setArgument: &completion atIndex: 4];
[invocation invoke];
break;
}
}
}
@end
Können Sie bitte erklären, wie Sie diesen Code verwenden? Ich habe auf diesen Teilen Sachen gehangen und nicht im Web gefunden. –