Как я изменяю заголовок “задней” кнопки на Панели навигации

Как кто-то еще отметил, глава 11 Josh Bloch , Эффективный Java является необходимым ресурсом на Сериализации Java.

Пара точек из той главы, подходящей для Вашего вопроса:

  • принятие Вы хотите сериализировать состояние несериализуемого поля в MyClass2, то поле должно быть доступно для MyClass, или непосредственно или через методов get и методы set. MyClass должен будет реализовать пользовательскую сериализацию путем обеспечения readObject и writeObject методы.
  • Класс несериализуемого поля должен иметь API, чтобы позволить добираться, это - состояние (для записи в объектный поток) и затем инстанцирование нового экземпляра с тем состоянием (при позже чтении из объектного потока.)
  • на Объект 74 из Эффективного Java, MyClass2 должен иметь конструктора без аргументов, доступного для MyClass, иначе для MyClass невозможно расширить MyClass2 и сериализуемую реализацию.

я записал быстрый пример ниже иллюстрирования этого.


class MyClass extends MyClass2 implements Serializable{

  public MyClass(int quantity) {
    setNonSerializableProperty(new NonSerializableClass(quantity));
  }

  private void writeObject(java.io.ObjectOutputStream out)
  throws IOException{
    // note, here we don't need out.defaultWriteObject(); because
    // MyClass has no other state to serialize
    out.writeInt(super.getNonSerializableProperty().getQuantity());
  }

  private void readObject(java.io.ObjectInputStream in)
  throws IOException {
    // note, here we don't need in.defaultReadObject();
    // because MyClass has no other state to deserialize
    super.setNonSerializableProperty(new NonSerializableClass(in.readInt()));
  }
}

/* this class must have no-arg constructor accessible to MyClass */
class MyClass2 {

  /* this property must be gettable/settable by MyClass.  It cannot be final, therefore. */
  private NonSerializableClass nonSerializableProperty;

  public void setNonSerializableProperty(NonSerializableClass nonSerializableProperty) {
    this.nonSerializableProperty = nonSerializableProperty;
  }

  public NonSerializableClass getNonSerializableProperty() {
    return nonSerializableProperty;
  }
}

class NonSerializableClass{

  private final int quantity;

  public NonSerializableClass(int quantity){
    this.quantity = quantity;
  }

  public int getQuantity() {
    return quantity;
  }
}

220
задан jeremysprofile 9 May 2019 в 10:24
поделиться

4 ответа

Это должно быть помещено в метод, который вызывает ViewController под названием «NewTitle». Прямо перед оператором push или popViewController.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
341
ответ дан 23 November 2019 в 04:05
поделиться

Хорошо, вот способ. Если у вас есть контроллер представления «первый», а вы перемещаетесь по другому контроллеру представления «вторым», нажимая кнопку или т. Д., Вам необходимо проделать некоторую работу. Сначала вам нужно создать BarButtonItem во «втором» методе ViewDidLoad контроллера представления, как это:

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

После того, как вы это сделаете, вам нужно написать код для действия «btnBack» в том же файле .m, как этот;

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

Это все.

17
ответ дан 23 November 2019 в 04:05
поделиться

Вот другой способ сделать это.

В контроллере родительского представления реализуйте следующий метод:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}

В контроллере дочернего представления, когда вы хотите изменить заголовок, это будет работа:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

Мне так и не удалось заставить работать свойство parentViewController :

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

Я не знаю, ошибка это или я не использую его должным образом. Но захват предпоследнего контроллера представления в массиве viewControllers указывает на родительский контроллер представления, и я могу правильно вызывать родительские методы с этой ссылкой.

6
ответ дан 23 November 2019 в 04:05
поделиться

Может быть, я слишком упрощаюсь, но из документации Apple формулировка такая:

Если пользовательский элемент кнопки панели не указан ни одним из контроллеров представления, используется кнопка возврата по умолчанию , и ее заголовок устанавливается равным значению свойства title предыдущего контроллера представления, то есть контроллера представления на один уровень ниже в стеке.

Решение, отмеченное выше как правильное, устанавливает элемент кнопки по умолчанию из родительского контроллера. Это правильный ответ, но я решаю проблему, изменяя свойство self.title UIViewController прямо перед тем, как поместить новый контроллер в стек NavigationController.

Это автоматически обновляет заголовок кнопки «Назад» на странице следующий контроллер, и пока вы установите self.

26
ответ дан 23 November 2019 в 04:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: