ios共享扩展帖子按钮标题

Est*_*i M 7 ios ios8-share-extension

我想在SLComposeServiceViewController中更改帖子按钮的标题.我设法得到了UIButton:

NSArray* subviews =[self.navigationController.navigationBar subviews];
UIButton* postButton =[subviews lastObject];
Run Code Online (Sandbox Code Playgroud)

我试图设置这样的标题:

[postButton setTitle:@"Save" forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

但标题没有改变.

谁能帮我这个?

我在iPad上看到了Evernote的分享扩展,它看起来像这样: 在此输入图像描述

UPDATE

我的解决方案

我找到了问题的解决方案,我删除了原始导航栏并创建了自定义导航栏.

我有两个导航栏:1.带"取消"\"保存"按钮2.带"后退"按钮

导航到其他viewcontroller时我改变它们(在我的情况下我需要上传文件,用户需要从列表中选择位置)

注意:如果您没有实现configurationItems,则只需要第一个导航栏.(只需调用以设置自定义导航栏viewDidAppear

所以我的代码在这里:

@property (strong, nonatomic) UINavigationBar *customNavBar;

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];  
    self.customNavBar = [[UINavigationBar alloc] initWithFrame:self.navigationController.navigationBar.bounds];
    [self.navigationController.navigationBar removeFromSuperview];
    [self.navigationController.view addSubview:self.customNavBar];
    [self setCancelSaveNavigationItem];
}
Run Code Online (Sandbox Code Playgroud)

setCancelSaveNavigationItem - >从shareViewController的viewDidAppear调用

-(void)setCancelSaveNavigationItem
{
    UINavigationItem *newItem = [[UINavigationItem alloc] init];
    UIBarButtonItem *cancelBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel",nil)  style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonTapped:)];
    UIBarButtonItem *saveBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done",nil)  style:UIBarButtonItemStyleDone target:self action:@selector(saveButtonTapped:)];
    newItem.leftBarButtonItem = cancelBarButtonItem;
    newItem.rightBarButtonItem = saveBarButtonItem;
    [self.customNavBar setItems:@[newItem]];
    [self.navigationItem setBackBarButtonItem:cancelBarButtonItem];
    [self.navigationItem setRightBarButtonItem:saveBarButtonItem];
    if(self.item.value == nil){
        saveBarButtonItem.enabled = NO;
    }
}
Run Code Online (Sandbox Code Playgroud)

setBackNavigationItem - configurationItems>在self.item.tapHandler函数中调用- >

-(void)setBackNavigationItem
{
    UINavigationItem *newItem = [[UINavigationItem alloc] init];
    UIBarButtonItem *selectBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Select",nil)  style:UIBarButtonItemStylePlain target:self action:@selector(selectButtonTapped:)];
    UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:[NSString stringWithFormat:@"? %@", NSLocalizedString(@"Back",nil)]  style:UIBarButtonItemStylePlain target:self action:@selector(backButtonTapped:)];
    newItem.leftBarButtonItem = backBarButtonItem;
    newItem.rightBarButtonItem = selectBarButtonItem;
    [self.customNavBar setItems:@[newItem]];
    [self.navigationItem setBackBarButtonItem:backBarButtonItem];
    [self.navigationItem setRightBarButtonItem:selectBarButtonItem];
}
Run Code Online (Sandbox Code Playgroud)

手柄按钮:

- (void)backButtonTapped:(id)sender {
    if([self.navigationController.viewControllers count] ==2){
        [self setCancelSaveNavigationItem];
    }
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)cancelButtonTapped:(id)sender {
    [self cancel];
}

- (void)selectButtonTapped:(id)sender {
    ...
    [self setCancelSaveNavigationItem];
    [self popConfigurationViewController];
}

- (void)saveButtonTapped:(id)sender {
    ...
    [self cancel];
}
Run Code Online (Sandbox Code Playgroud)

这对我有用!!!

结果:

在此输入图像描述

在此输入图像描述

use*_*836 11

简单地说 viewDidAppear

self.navigationController?.navigationBar.topItem?.rightBarButtonItem?.title = "Save"
Run Code Online (Sandbox Code Playgroud)


Tom*_*ton 7

你的代码:

NSArray* subviews =[self.navigationController.navigationBar subviews];
UIButton* postButton =[subviews lastObject];
Run Code Online (Sandbox Code Playgroud)

...... 真是个糟糕的主意.它只能起作用,因为post按钮位于subviews并且是数组中的最后一项.但内容subviews没有记载,可能随时改变.此外,由于此按钮没有公共API,因此完全有可能使用框架代码来阻止或覆盖按钮文本的更改 - 因此即使我们假设您拥有正确的UI元素,您仍然可能无法更改它.

Evernote的用户界面几乎可以肯定是一个完全定制的设计,只有类似的东西SLComposeServiceViewController.不需要使用共享扩展SLComposeServiceViewController,这只是为了方便起见.如果它不符合您的需求,请设计您自己的.

更新:出于好奇,我解压Evernote的IPA,并看看在EvernoteShare.appex纳米.没有提及SLComposeServiceViewController,这证实了Evernote在他们的扩展中没有使用该类.