2013-02-19 137 views
3

我想在我的故事板由幾個類實例的一個UIViewController。所以我讓場景「課程」在我的故事板中爲空(所以默認情況下,它的UIViewController?)。然後,我將故事板ID填入「MyGenericView」。故事板UIViewController與多個類

下面是一些類:

@interface ClassA: UIViewController 

@interface ClassB: UIViewController 

MyGenericView包含了所有的原型,我需要建立我的ClassA和ClassB的視圖。這裏是我instancied我ClassA

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

最後,我的觀點是在應用程序代碼,但在我的ClassA不會被調用顯示。由instantiateViewControllerWithIdentifier返回的對象是UIViewController,投射不起作用。

我不想用ClassA填充字段「class」,因爲我想重複使用此視圖來獲取ClassB。但是我不想在故事板中複製這個視圖。

說不上來,如果它似乎很清楚你的,我爲我的英語不好道歉:)

謝謝!

+0

你確定A類和B類真的需要兩個單獨的類嗎? – 2013-02-19 18:28:52

回答

4

我吹我的心找到一個解決這個問題 但只可工作的事情(我認爲) 是使用代表,而不是子類。

我的意思是, 你可以實現3類:ClassP,ClassC1,ClassC2; 鏈接與ClassP你的故事板實現了一個委託協議,然後 呈現前(進入prepearForSegue?),你可以的 segue.destinationViewController(的P型)的委託設置爲你的類ClassC1或ClassC2, 之一明顯地實現協議。

示例代碼(未測試):

ClassP

@protocol ClassPDelegate <NSObject> 

- (void)foo; 

@end 

@interface ClassP : UIViewController 
... 
@end 

ClassC1和ClassC2

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

主叫類

... 
- (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 2013-02-20 10:11:45

-1

你想做什麼,什麼是可能的並不總是相同的事情。鑄造不會奇蹟般地將UIViewController變成一個ClassA視圖控制器。您需要將故事板中的類更改爲ClassA或ClassB。您可以將您創建的視圖複製並粘貼到任意數量的視圖控制器中。那有什麼問題?

+5

在我看來,這不是一個好的解決方案。我也面臨這個問題。當你想要一個定義好UI的基類時,應該有相同用戶界面的10個子類(或在代碼中完成的小改動)在故事板中有11個viewController時感覺不對。所以你不能做好OOP或繼承。在蘋果公司恥辱! – Sebastian 2014-02-14 19:29:34