ios - 从 Swift 中的 UIActivityViewController 中排除注释和提醒

标签 ios objective-c swift uiactivityviewcontroller

有人知道如何在 Swift 中执行此操作(下面的代码)吗? 这是这个问题的第一个答案How to exclude Notes and Reminders apps from the UIActivityViewController?

标题:

@interface UIActivityViewController (Private)

- (BOOL)_shouldExcludeActivityType:(UIActivity*)activity;

@end

@interface ActivityViewController : UIActivityViewController

@end

实现:

@implementation ActivityViewController

- (BOOL)_shouldExcludeActivityType:(UIActivity *)activity
{
    if ([[activity activityType] isEqualToString:@"com.apple.reminders.RemindersEditorExtension"] ||
        [[activity activityType] isEqualToString:@"com.apple.mobilenotes.SharingExtension"]) {
        return YES;
    }
    return [super _shouldExcludeActivityType:activity];
}

最佳答案

我有同样的要求,但无法弄清楚如何覆盖 _shouldExcludeActivityType Swift 中的方法也可以。

在尝试 method swizzling 失败之后我得出的结论是,使用 Objective-C 创建派生类,然后使用桥接 header 将派生类公开给我的 swift 代码的其余部分,这是最简单、最好的方法。

如果你真的想在 swift 中实现大部分逻辑,只需覆盖 _shouldExcludeActivityType Objective-C 派生类中的方法委托(delegate)给某个返回 BOOL 的方法,然后在 swift 中创建另一个派生类来重写该方法。

Object-C 派生类 header

#import <UIKit/UIKit.h>

@interface BaseBrowserActivityViewController : UIActivityViewController

- (BOOL)shouldExcludeActivityType:(UIActivity *)activity;

@end

Object-C 派生类实现

#import "BaseBrowserActivityViewController.h"

@interface BaseBrowserActivityViewController ()

@end

@implementation BaseBrowserActivityViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (BOOL)_shouldExcludeActivityType:(UIActivity *)activity
{
    return [self shouldExcludeActivityType:activity];
}

- (BOOL)shouldExcludeActivityType:(UIActivity *)activity
{
    assert(false);  // shouldExcludeActivityType requires overriding.
    return false;
}

@end

Swift 派生类实现

import UIKit

class BrowserActivityViewController: BaseBrowserActivityViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func shouldExcludeActivityType(_ activity: UIActivity!) -> Bool {
        // Do some testing of the activity here.
        return true
    }
}

关于ios - 从 Swift 中的 UIActivityViewController 中排除注释和提醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34768627/

相关文章:

ios - iOS 中的 Amazon S3 POST 上传

ios - 当专辑信息可用时,按专辑对歌曲数组进行排序

ios - 获取 Assets 目录文件夹中所有图像的数组

ios - View 已绘制但未检测到手势识别器

ios - 使用时钟更改 View Controller 的背景颜色但不更改顶部区域

ios - 部分屏幕中的 UIScrollView

ios - 如果 UIBackgroundModes 中定义的远程通知和新的推送通知出现,iOS 是否会在重启后在后台启动应用程序?

objective-c - 异常[NSNull isEqualToString:]:当我单击calloutAccessoryControlTapped时无法识别的选择器

ios - 处理堆栈 View 上的多次点击手势

swift - 来自数组元素的 NSPredicate IN 查询