2016-03-28 9 views
2

Ich habe einen einfachen View-Controller, der einen SFSafariViewController anzeigt, wenn auf eine Link-Schaltfläche geklickt wird.SFSafariViewControllerDelegate-Methoden werden nicht aufgerufen, wenn Delegate einem anderen als dem View-Controller zugewiesen werden

#import "ViewController.h" 
#import "SafariDelegate.h" 

@interface ViewController() 

@property(nonatomic, strong) NSString *url; 
@property(nonatomic, weak) SafariDelegate *safariDelegate; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.url = @"http://www.google.com"; 
} 

- (IBAction)linkTapped:(id)sender { 
    SFSafariViewController *vc = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:self.url]]; 
    SafariDelegate *safariDelegate = [[SafariDelegate alloc] init]; 
    vc.delegate = safariDelegate; 
    [self presentViewController:vc animated:YES completion:nil]; 
} 

@end 

SafariDelegate entspricht SFSafariViewControllerDelegate und protokolliert nur, wenn die Delegatmethoden Feuer.

SafariDelegate.h

#import <Foundation/Foundation.h> 
#import <SafariServices/SafariServices.h> 

@interface SafariDelegate : NSObject <SFSafariViewControllerDelegate> 

@end 

SafariDelegate.m

#import "SafariDelegate.h" 

@implementation SafariDelegate 

- (NSArray<UIActivity *> *)safariViewController:(SFSafariViewController *)controller activityItemsForURL:(NSURL *)URL  title:(nullable NSString *)title 
{ 
    NSLog(@"safariViewController activityItemsForURL"); 

    return @[]; 
} 

- (void)safariViewControllerDidFinish:(SFSafariViewController *)controller 
{ 
    NSLog(@"safariViewControllerDidFinish"); 
} 


- (void)safariViewController:(SFSafariViewController *)controller didCompleteInitialLoad:(BOOL)didLoadSuccessfully 
{ 
    NSLog(@"safariViewController didCompleteInitialLoad"); 
} 

@end 

Wenn ich die Taste tippen, lädt die safariviewcontroller die Seite richtig, aber die Delegierten Methoden aufgerufen nie (auch wenn Ich drücke 'Fertig'). Ich habe einen Haltepunkt an der Linie angebracht, wo der 'vc' präsentiert wird, und bestätigt, dass der Delegierte zu diesem Zeitpunkt richtig eingestellt ist. Was vermisse ich?

Antwort

3

SafariViewController behält seinen Delegaten nicht, daher wird er sofort freigegeben, nachdem Ihre linkTapped:-Methode zurückgegeben wurde, da nichts anderes einen starken Verweis darauf hat.

Sie müssen irgendwo einen starken Bezug darauf haben. Sie könnten wahrscheinlich die Eigenschaft, die Sie in Ihrem aktuellen View-Controller haben, einfach auf strong ändern und dort speichern. Sie können es auch in einem zugeordneten Objekt auf dem Safari-View-Controller speichern.

Verwandte Themen