首页 文章

将委托分配给视图控制器以外的其他内容时未调用的SFSafariViewControllerDelegate方法

提问于
浏览
3

我有一个简单的视图控制器,当点击链接按钮时,它呈现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'的行处设置了一个断点并确认该委托在该点正确设置 . 我错过了什么?

1 回答

  • 4

    SafariViewController 不保留其委托,因此在 linkTapped: 方法返回后立即取消分配,因为没有其他任何内容具有强引用 .

    你需要在某个地方保持对它的强烈引用 . 您可能只需将当前视图控制器中的属性更改为 strong 并将其存储在那里 . 您还可以将其保存在safari视图控制器上的关联对象中 .

相关问题