Могу ли я использовать segues с назначенными инициализаторами контроллеров представления?
Я новичок в раскадровке, и я настроил переход от кнопки к контроллеру представления. Этот контроллер представления имеет пользовательский подкласс SFListViewController
, который имеет назначенный инициализатор initWithList:
,
Использование назначенного инициализатора - единственный способ правильно инициализировать контроллер представления. Однако при использовании сегментов назначенный инициализатор вызываться не будет (очевидно).
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"Show List"]) {
SFListViewController *listViewController = segue.destinationViewController;
// ????
}
}
Как я могу заставить segue вызывать назначенный инициализатор при выполнении?
1 ответ
Насколько я знаю, это невозможно, так как структура раскадровки просто вызывает alloc
а также init
на класс, который вы определяете в Interfacebuilder. Кроме того, destinationViewController
Атрибут доступен только для чтения, поэтому вы не можете просто заменить существующий ViewController.
Вероятно, единственный способ использовать раскадровку - создать класс-обертку, который внутренне создает экземпляр SFListViewController
с желаемыми атрибутами, а затем функционирует как прокси-объект и, таким образом, распространяется viewDid***
а также viewWill***
-методы к упакованному классу, а также возвращают представление упакованного VC только для чтения view
собственность... Вы поняли.
Обычно существует несколько альтернативных способов инициализации UIViewController
в таком случае:
Существует возможность указать "Определенные пользователем атрибуты времени выполнения", которые можно использовать для инициализации.
Переопределить
prepareForSegue:
метод, как вы пытались, в вашем корневом ViewController и выполните там "post-alloc-init-initialisation".Если худшее станет худшим, вы можете вернуться к
IBAction
для того, чтобы иметь возможность инициализировать ViewController самостоятельно.
Надеюсь, это поможет.
Изменить: я могу проверить, что Proxy-подход работает, так как я только что столкнулся с подобной проблемой с ABPeoplePickerNavigationController
где этот подход работал хорошо. Так как мы настроили это на нашей доске объявлений, обратите внимание, что вы должны использовать awakeFromNib
для того, чтобы сделать первоначальную настройку (вместо некоторых init
метод).
Это код для моего класса оболочки:
#import "PeoplePickerViewControllerWrapper.h"
@implementation PeoplePickerViewControllerWrapper
@synthesize ppvc = _ppvc; // This is the object I'm proxying (The proxyee so to speak)
@synthesize delegate = _delegate;
- (void)awakeFromNib
{
self.ppvc = [[ABPeoplePickerNavigationController alloc] init ];
self.ppvc.peoplePickerDelegate = self;
self.ppvc.addressBook = ABAddressBookCreate();
self.ppvc.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]];
}
#pragma mark - View lifecycle
- (void)loadView
{
[super loadView];
[self.ppvc loadView];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.ppvc viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.ppvc viewWillAppear:animated];
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[self.ppvc viewDidDisappear:animated];
}
-(UIView *)view{
return self.ppvc.view;
}
- (void)viewDidUnload
{
[super viewDidUnload];
[self.ppvc viewDidUnload];
}