2013-12-21 56 views
7

我想要一個包含多個視圖的視圖。看到下面的圖片: enter image description here在一個窗口中嵌入多個視圖控制器

當你看到pageController控制頁面導航並提供viewController(page)之前和之後。

pageContentController顯示文本並對其進行處理。

聲音播放管理着打聲相關

我可以擁有所有的人都在一個控制器,但我的控制器必須做大量的任務和管理這將是艱鉅的任務。因爲它違反光視圖控制器。並降低其凝聚力。 所以我想知道我該如何做到這一點 請詳細解釋。

回答

5

感謝您詳細解答。你的回答澄清了我。我所做的:

我加SoundPalyerVCPageContentVC

SoundPlayerVC *soundPlayer = [[StoryViewController alloc] initWithStory:self.storyManagedObject]; 
[self addChildViewController:soundPlayer]; 
[self.view addSubview:soundPlayer.view]; 
[soundPlayer didMoveToParentViewController:self]; 
soundPlayer.view.frame = CGRectMake(0, self.view.frame.size.height-soundPlayer.view.frame.size.height, 320, soundPlayer.view.frame.size.height); 

那是那麼容易的孩子。現在我的代碼是分開的。

1

我會做的是:

1)爲每個視圖創建自定義類。
2)然後我將視圖類設置爲我創建的類。

Setting the Class of the View to the custom created class

3)然後我會寫代碼來處理你需要這些視圖類中的任何功能。

@interface PageContent : UIView 

- (void) showTest : (NSString *) textToShow; 

@end 

@implementation PageContent 

- (void) showTest : (NSString *) textToShow 
{ 
    //Then here you would do whatever you need to do with this text, and display it 
} 
@end 

@interface SoundPlayer : UIView 

- (void) playSound; 

@end 


@implementation SoundPlayer 

-(void) playSound 
{ 
    //Do whatever you need to do with the sound here. 
} 

@end 

4)然後在視圖控制器類中爲這些視圖中的每一個創建插座。

//So your View Controller Class would look something like this. 

@interface YourViewController : UIViewController 

@property (strong, nonatomic) IBOutlet Page *page; 
@property (strong, nonatomic) IBOutlet PageContent *pageContent; 
@property (strong, nonatomic) IBOutlet SoundPlayer *soundPlayer; 

@end 

5)然後在您的視圖控制器@implementation你可以做的東西一樣

@implementation YourViewController 

-(void) showContent 
{ 
    [self.pageContent showText:@"Text To Show"]; 
} 
-(void) playSound 
{ 
    [self.soundPlayer playSound]; 
} 

@end 

現在,當你調用視圖控制器,這些([自showContent]或[自playSound])的方法,它會調用特定視圖的方法,這樣你就不會有非常長的不可重用視圖控制器。

我剛剛展示了一個視圖示例,我希望你能看到我在這裏做什麼,併爲你需要的任何東西實現它。

1

在頁面控制器視圖中,將pageContentController的視圖和soundPlayer的視圖添加爲子視圖。

寫下面的代碼pageController.m文件

soundPlayer = [[SoundPlayer alloc] init]; 
[self.view addSubview:soundPlayer.view]; 
souldPlayer.frame = //set it value as desired. 

與之相似的pageContentController。

+0

不,你不應該這樣做。你應該混合來自不同視圖控制器的視圖的唯一方法是使用在iOS 5中添加並在iOS 6中展開的父/子視圖控制器方法(請參閱下面的我的帖子)。我試過你描述的內容,它會導致各種各樣的問題,特別是自動旋轉和轉發系統通知,如低內存通知,抖動事件等等。這是可能的,但蘋果公司說不要這樣做,並且你的負擔是讓你的一切工作正常。爲什麼要打呢?嵌入賽段讓它變得簡單! –

0

我會意識到,通過接口構建器的容器視圖對象。從描述中獲得: 「容器視圖在視圖控制器的視圖子圖中定義了一個可包含子視圖控制器的區域。在容器視圖中創建一個嵌入segue到故事板中的子視圖控制器。

通過這種方式,您可以在父視圖控制器中定義兩個想要作爲子視圖控制器的區域,並且可以在您的pageContent中加載一個UIPageViewController,並在您的playerplayer中加載您的playercontroller。

1

從iOS 5開始,Apple爲操作系統添加了父/子視圖控制器支持。在UIViewController類中有新的調用來支持設置父/子視圖控制器關係,其中一個視圖控制器(父級)設置或使用更多其他視圖控制器,以便將其內容視圖插入到父級視圖層次結構中。這是一個重大改進,但是要做好正確的工作並使一切正常工作。

從iOS 6開始,Apple添加了容器視圖(這只是一個具有特殊類型的UIView)並嵌入了segues。你所做的是打開將成爲IB中父級的視圖控制器的場景,選擇接口對象列表並鍵入「container」。你應該看到一個容器視圖。將容器視圖拖放到您的父視圖控制器上,並將其放置在您想要的位置。

然後從您的容器視圖控制拖動到定義要放置在該容器中的子視圖控制器的界面的場景。它應該默認創建一個嵌入segue。接受默認值。這是非常多的。現在,當您加載父視圖控制器時,系統還會實例化您已設置的任何子視圖控制器,並連接所有使其正常工作的「管道」。

如果您需要父母和孩子進行溝通,您可以在您的嵌入segue上設置標識符,然後編寫配置孩子的prepareForSegue代碼,就像其他任何segue一樣。

容器視圖和嵌入段是很好的,並設置這種事情很容易。

我在github上有一個示例項目,它使用嵌入segues來取得良好效果。這裏的鏈接:

Demo project using embed segues to manage 2 static table views in a parent VC.

相關問題