2013-02-19 3 views
3

Я хочу один UIViewController в своем раскадровке, созданном несколькими классами. Поэтому я разрешаю поле «class» пусто в моей раскадровке (так по умолчанию его UIViewController?). Затем я заполняю идентификатор раскадровки «MyGenericView».Раскадровка UIViewController с несколькими классами

Вот некоторый класс:

@interface ClassA: UIViewController 

@interface ClassB: UIViewController 

MyGenericView содержит все прототип мне нужно, чтобы построить свою точку зрения в ClassA и ClassB. Вот как я instancied мой ClassA:

ClassA *myClass = (ClassA*)[storyboard instantiateViewControllerWithIdentifier:@"MyGenericView"]; 

Наконец, моя точка зрения показано в приложении, но код в моем ClassA никогда не называется. Объект, возвращаемый instantiateViewControllerWithIdentifier, является UIViewController, литой не работает.

Я не хочу заполнять поле «класс» классом, потому что я хочу повторно использовать этот вид для ClassB. Однако я не хочу дублировать это мнение в своем раскадровке.

Незнайка, если это кажется очевидным для вас, я извиняюсь за мой плохой английский :)

Спасибо!

+0

Вы уверены, что класс A и класс B действительно должны быть двумя отдельными классами? –

ответ

4

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

Я имею в виду, вы можете реализовать 3 класса: ClassP, ClassC1, ClassC2; связать раскадровку с ClassP, который реализует протокол делегата, затем до представления (в prepearForSegue?) Вы можете установить делегат segue.destinationViewController (типа Р) к одному из ваших классов ClassC1 или ClassC2, который, очевидно, реализует протокол.

Пример кода для (не проверено):

ClassP

@protocol ClassPDelegate <NSObject> 

- (void)foo; 

@end 

@interface ClassP : UIViewController 
... 
@end 

ClassC1 и ClassC2

#import "ClassP.h" 
@property (nonatomic, weak) id <ClassPDelegate> delegate; 

Caller Класс

... 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"mySegue"]) 
    { 
     ClassC1 *classC1 = [[ClassC1 alloc] init]; 
     [(ClassP *)segue.destinationViewController setDelegate:classC1]; 
    } 
} 
... 

Я надеюсь, что это работает! ps: Прошу прощения, но ваш английский лучше, чем мой!

+0

Спасибо, он отлично работал :) – ApheX

-1

Что вы хотите делать, и что возможно, это не всегда одно и то же. Кастинг не волшебным образом превращает UIViewController в контроллер представления ClassA. Вам нужно изменить класс в раскадровке на ClassA или ClassB. Вы можете скопировать и вставить созданный вами вид в такое же количество других контроллеров представлений, сколько захотите. Что в этом плохого?

+5

По-моему, это нехорошее решение. Я тоже сталкиваюсь с этой проблемой. Если вам нужен один базовый класс с определенным пользовательским интерфейсом, и у вас есть, например,10 подклассов, которые должны иметь один и тот же пользовательский интерфейс (или небольшие изменения, которые будут выполняться в коде), кажется неправильным иметь 11 viewControllers в раскадровке. Таким образом, вы не можете делать хороший ООП или наследование. Позор на Apple! – Sebastian