2015-02-12 2 views
5

Я хочу изменить название почтовых кнопок в SLComposeServiceViewController. мне удалось получить UIButton:ios share extension post button title

NSArray* subviews =[self.navigationController.navigationBar subviews]; 
UIButton* postButton =[subviews lastObject]; 

и я попытался установить название, как это:

[postButton setTitle:@"Save" forState:UIControlStateNormal]; 

но название не изменилось.

Может ли кто-нибудь помочь мне с этим?

Я видел расширение доли Evernote на моем IPad и это выглядит следующим образом: enter image description here

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]; 
} 

setCancelSaveNavigationItem -> вызывается из viewDidAppear из shareViewController

-(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; 
    } 
} 

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]; 
} 
Кнопки

ручки постучала:

- (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]; 
} 

И это работа для меня !!!

Результат:

enter image description here

enter image description here

+0

Вы уверены UIButton * postButton = [подвиды lastObject]; действительно ли вы пытаетесь настроить? Попробуйте NSLog это название. – user3344236

+0

@ user3344236 Да, я попробовал, поэтому я предположил, что это кнопка post ... –

ответ

7

Ваш код:

NSArray* subviews =[self.navigationController.navigationBar subviews]; 
UIButton* postButton =[subviews lastObject]; 

... это действительно плохая идея. Он работает только потому, что кнопка сообщения находится в subviews и является последним элементом массива. Но содержание subviews недокументировано и может измениться в любое время.Кроме того, поскольку для этой кнопки нет общедоступного API, вполне возможно, что существует код рамки для предотвращения или переопределения изменений в тексте кнопки - поэтому, даже если мы предположим, что у вас есть правильный элемент пользовательского интерфейса, вы все равно не сможете его изменить ,

Пользовательский интерфейс Evernote - это почти наверняка полный пользовательский дизайн, который напоминает только SLComposeServiceViewController. Нельзя использовать дополнительные расширения для использования SLComposeServiceViewController, это просто для удобства. Если это не соответствует вашим потребностям, создайте свои собственные.

Обновление: из любопытства Я расстегнул IPhone Evernote и посмотрел EvernoteShare.appex на nm. Нет ссылки на SLComposeServiceViewController, что подтверждает, что Evernote не использует этот класс в своем расширении.

+0

«вполне возможно, что есть код рамки для предотвращения или переопределения изменений текста кнопки». Я считаю, что вы абсолютно правы: [Я пытался] (http://stackoverflow.com/a/31770293/3765705) итерировать через все подзаголовки, больше как доказательство концепции, чем для фактического использования в моем приложении, и пока я успешно дойдем до двух кнопок, я не могу переопределить их цвет и текст. Очень жаль! – cdf1982

+0

Ну, я немного поработал над этим, и я смог заставить его работать на iOS 8.4 - см. [Этот ответ] (http://stackoverflow.com/a/31770293/3765705) здесь, в Stack Overflow; Я больше не верю, что Apple внедрила код для предотвращения подобных изменений, но все же я не уверен, что это должно быть сделано. Скажем, это был интересный способ провести утреннее утро;) – cdf1982

+0

@ cdf1982 Я поделился своим решением в своем вопросе, и это работа над всеми версиями. Я просто создаю новую панель навигации, и я удаляю оригинал из подвид. –

4

Просто в viewDidAppear

self.navigationController?.navigationBar.topItem?.rightBarButtonItem?.title = "Save"