【问题标题】:Customize SLComposeServiceViewController pop up of share extension iOS 8自定义 SLComposeServiceViewController 弹出分享扩展 iOS 8
【发布时间】:2014-12-09 08:04:46
【问题描述】:

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

【问题讨论】:

  • documentation 应该会有所帮助。
  • 我也在寻找更多关于自定义 SLComposeServiceViewController 的信息

标签: objective-c ios8-extension


【解决方案1】:

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

我将基类 SLComposeServiceViewController 更改为 UIViewController,以便进行一些自定义。所以我们知道我们可以添加像evernote这样的弹出窗口,我们也可以将动画应用于该弹出窗口。

您可以在 viewController 的 viewddidload 方法中获取 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 链接。有关获取图像和其他信息的更多信息,最好仅参考苹果文档。

Apple Documentation

【讨论】:

  • 我认为在同一个文档中提到最好将 MobileCoreServices 中定义的常量用于 UTI 类型。类似:if([currentItem hasItemConformingToTypeIdentifier:(__bridge NSString *)kUTTypeURL])
【解决方案2】:

要更改“发布”按钮文本,这里有一个 Swift 解决方案,它很可能会通过审核(请注意,我还没有尝试过)。在 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
        }
    }
}

【讨论】:

    【解决方案3】:

    你可以改变例如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 的未记录内部结构

    【讨论】:

      【解决方案4】:

      这适用于 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";
              }
          }
      }
      

      注意它在 viewDidAppear 而不是 viewDidLoad。该按钮实际上是UINavigationButton 的一个实例,但是我将它转换为一个 UIBarButtonItem,它是它的公共对应物。我还没有验证这是否会通过 Apple 审查,因为他们可能会争论它使用私有 API。如果帖子标题被本地化为其他语言,那么这将不起作用,但这没什么大不了的,因为更改标题是purley 化妆品。由于某些国家/地区存在从右到左的问题,我会犹豫是否根据其子视图顺序更改标题,但是可以做的一件事是检查哪个是粗体/有边框的,那就是发布按钮。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多