Objective c 自定义共享扩展iOS 8的SLComposeService ViewController弹出窗口

Objective c 自定义共享扩展iOS 8的SLComposeService ViewController弹出窗口,objective-c,ios8-extension,Objective C,Ios8 Extension,我已在我的应用程序中集成了共享扩展,但我想根据项目要求对SLComposeService ViewController弹出窗口进行一些修改,如更改按钮标题并为文本视图和标题设置背景色。我该怎么做呢?我在回答我的问题,是否有人能帮我解决这个问题。在阅读了许多文章之后,我提出了以下解决方案。因为没有足够的内容可以尝试 我将基类SLComposeServiceViewController更改为UIViewController,以便进行一些定制。正如我们所知,我们可以像evernote一样添加弹出窗口,

我已在我的应用程序中集成了共享扩展,但我想根据项目要求对SLComposeService ViewController弹出窗口进行一些修改,如更改按钮标题并为文本视图和标题设置背景色。我该怎么做呢?

我在回答我的问题,是否有人能帮我解决这个问题。在阅读了许多文章之后,我提出了以下解决方案。因为没有足够的内容可以尝试

我将基类SLComposeServiceViewController更改为UIViewController,以便进行一些定制。正如我们所知,我们可以像evernote一样添加弹出窗口,也可以将animationt应用于该弹出窗口

您可以在viewController的ViewDddLoad方法中获得post方法回调。您可以在其中执行以下操作:

- (void)viewDidLoad {
    NSExtensionItem *item = self.extensionContext.inputItems.firstObject;
    NSItemProvider *itemProvider = item.attachments.firstObject;

    if ([itemProvider hasItemConformingToTypeIdentifier:@"public.url"]) {
        [itemProvider loadItemForTypeIdentifier:@"public.url"
                                        options:nil
                              completionHandler:^(NSURL *url, NSError *error) {
                                  NSString *urlString = url.absoluteString;
                                  NSLog(@"%@",urlString);

                          }];
    }
}
从上面的代码可以获得url链接。有关获取图像和其他信息的更多信息,最好只参考苹果的文档


您可以通过以下操作更改
SLComposeServiceViewController
的按钮标题:

class CustomServiceViewController: SLComposeServiceViewController {
    override func viewDidLoad() {
        let navigationBar = view.subviews.first?.subviews?.last? as? UINavigationBar
        let postButton = navigationBar?.subviews.last? as? UIButton
        let cancelButton = navigationBar?.subviews.last? as? UIButton
        postButton?.setTitle("Done", forState: .Normal)
    }
}

请注意-这是一个脆弱的解决方案,它基于
SLComposeServiceViewController
的未记录内部结构,从Xcode 6.4和iOS 8.4开始运行

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    for(UIView* v in self.navigationController.navigationBar.subviews){
        if(![v isKindOfClass:[UIButton class]]){
            continue;
        }
        UIBarButtonItem* b = (UIBarButtonItem*)v;
        if([b.title isEqualToString:@"Post"]){
            b.title = @"Save";
        }
    }
}

注意它在ViewDidDisplay中出现,而不是viewDidLoad。这个按钮实际上是一个例子,但我把它投给了一个UIBarbuttonite,这是它的公共对应物。我还没有证实这是否能通过苹果评论,因为他们可能会争辩说它使用的是私有API。如果文章标题在其他语言上本地化,那么这将不起作用,但这并不是什么大问题,因为更改标题是一种装饰性的行为。我会犹豫是否根据子视图顺序更改标题,因为在某些国家/地区会出现从右到左的问题,但是可以做的一件事是检查哪个标题是粗体/带边框的,这就是post按钮。

要更改post按钮文本,这里有一个快速的解决方案,最有可能通过审查(注意,我还没有尝试过)。在
SLComposeServiceViewController
子类中执行此操作:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    // Reset Post button text.
    for item in (self.navigationController?.navigationBar.items)! {
        if let rightItem = item.rightBarButtonItem {
            rightItem.title = "Save"
            break
        }
    }
}

这应该会有所帮助。我也在寻找关于定制SLComposeService ViewControlleri的更多信息。我认为在它提到的同一文档中,最好使用MobileCoReserves中为UTI类型定义的常量。类似于:
if([currentItem hasItemConformingToTypeIdentifier:(\uu bridge NSString*)kUTTypeURL])