2016-03-28 1 views
2

リンクボタンがタップされたときにSFSafariViewControllerを表示する単純なビューコントローラがあります。SFSafariViewControllerDelegateメソッドは、ビューコントローラ以外にデリゲートを割り当てるときに呼び出されません

#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はSFSafariViewControllerDelegateに準拠したときにデリゲートメソッドの火だけ記録します。

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 

私はボタンをタップすると、safariviewcontrollerが適切にページをロードするが、デリゲートメソッドは、(ときなど、呼び出されることはありません私は '完了'を押す)。私は 'vc'が表示されている行にブレークポイントを張り、その時点でデリゲートが適切に設定されていることを確認しました。私は何が欠けていますか?

答えて

3

SafariViewControllerはデリゲートを保持しないため、linkTapped:メソッドが返された直後にそのデリゲートが解放されます。これは他に何も参照されていないためです。

あなたはどこか強く参照する必要があります。おそらく現在のビューコントローラのプロパティをstrongに変更してそこに格納するだけです。また、サファリビューコントローラ上の関連オブジェクトに保持することもできます。

関連する問題