Как кто-то еще отметил, глава 11 Josh Bloch , Эффективный Java является необходимым ресурсом на Сериализации Java.
Пара точек из той главы, подходящей для Вашего вопроса:
я записал быстрый пример ниже иллюстрирования этого.
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;
}
}
Это должно быть помещено в метод, который вызывает ViewController под названием «NewTitle». Прямо перед оператором push или popViewController.
UIBarButtonItem *newBackButton =
[[UIBarButtonItem alloc] initWithTitle:@"NewTitle"
style:UIBarButtonItemStyleBordered
target:nil
action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];
Хорошо, вот способ. Если у вас есть контроллер представления «первый», а вы перемещаетесь по другому контроллеру представления «вторым», нажимая кнопку или т. Д., Вам необходимо проделать некоторую работу. Сначала вам нужно создать 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];
}
Это все.
Вот другой способ сделать это.
В контроллере родительского представления реализуйте следующий метод:
- (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
указывает на родительский контроллер представления, и я могу правильно вызывать родительские методы с этой ссылкой.
Может быть, я слишком упрощаюсь, но из документации Apple формулировка такая:
Если пользовательский элемент кнопки панели не указан ни одним из контроллеров представления, используется кнопка возврата по умолчанию , и ее заголовок устанавливается равным значению свойства title предыдущего контроллера представления, то есть контроллера представления на один уровень ниже в стеке.
Решение, отмеченное выше как правильное, устанавливает элемент кнопки по умолчанию из родительского контроллера. Это правильный ответ, но я решаю проблему, изменяя свойство self.title
UIViewController прямо перед тем, как поместить новый контроллер в стек NavigationController.
Это автоматически обновляет заголовок кнопки «Назад» на странице следующий контроллер, и пока вы установите self.