4

リンクボタンがタップされたときに SFSafariViewController を表示する単純なビューコントローラーがあります。

#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」が表示されている行にブレークポイントを貼り付け、その時点でデリゲートが適切に設定されていることを確認しました。私は何が欠けていますか?

4

2 に答える 2

6

SafariViewControllerデリゲートを保持しないため、メソッドが返された直後に割り当てが解除されますlinkTapped:。これは、他に強い参照がないためです。

どこかにそれへの強力な参照を保持する必要があります。おそらく、現在のView Controllerにあるプロパティを変更しstrongてそこに保存することができます。Safari ビュー コントローラーの関連オブジェクトに保持することもできます。

于 2016-03-28T23:59:41.897 に答える