2015-03-25 96 views
0

我正在設計一個iOS應用程序,其中包含10個主要的UIViewControllers。每個代表應用程序的不同部分。它基本上是一家公司,並顯示有關公司的信息。創建一個UIView的實例 - iOS

我在應用程序的底部(在所有不同的視圖控制器中)正在做的事情之一是顯示包含地圖的UIView。這張地圖顯示了某個地點。

現在,它的工作,但我有的問題是,我有10個相同的代碼副本和10個相同的UIView副本。

是否有無論如何我可以做一個小視圖控制器與一個類附加到它將處理地圖,然後在我的應用程序中的所有10視圖控制器中創建視圖控制器的實例?

我希望我的問題有道理。基本上我想知道如何在所有10個ViewController中重用ONE UIView。所以我可以稱之爲或什麼,它就會出現。

更新 - 這基本上就是我想實現

enter image description here

感謝,丹。

回答

3

視圖控制器可以包含其他視圖控制器。您可以在故事板中使用容器視圖或以編程方式設置關係(請參閱:Creating Custom Container View Controllers)。

故事板容器視圖是最簡單的,但程序化的解決方案不是太糟糕。

- (void)displayContentController:(UIViewController *)content 
{ 
    [self addChildViewController:content]; 
    content.view.frame = [self frameForContentController]; 
    // NOTE: You could also add it to any subview of self.view. 
    [self.view addSubview:content.view]; 
    [content didMoveToParentViewController:self]; 
} 

- (CGRect)frameForContentController 
{ 
    return CGRectMake(…); 
} 

- (void)viewDidLoad 
{ 
    … 
    MyMapViewController *mapViewController = …; 
    [self displayContentController:mapViewController]; 
    … 
} 

- (void)dismissContentController:(UIViewController *)content 
{ 
    [content willMoveToParentViewController:nil]; 
    [content.view removeFromSuperview]; 
    [content removeFromParentViewController]; 
} 

最後請注意:讓每個父視圖創建自己的地圖視圖控制器的實例。抵制在家長之間重複使用地圖視圖控制器實例的誘惑。


更新來解決問題

因此,可以說我在曾經有過同樣的看法控制器開放的2,他們兩人都顯示相同的進口視圖 - 控制那就不是工作的權利?

你不能這樣做。視圖控制器的一個實例只能有一個父視圖控制器。爲每個用途創建單獨的實例。

因此,如果我創建不同的實例,我可以重複使用相同的視圖可以說5次在一個視圖?

是的,如果你創建不同的實例,你可以在視圖中放置儘可能多的實例。

讓我明白,一個實例是使用構造函數創建的獨特內存位置。

MyMapViewController *mapViewController1 = [[MyMapViewController alloc] initWithNibName:@"MyMapViewController" bundle:nil]; 
MyMapViewController *mapViewController2 = [[MyMapViewController alloc] initWithNibName:@"MyMapViewController" bundle:nil]; 

MyMapViewController *mapViewController1 = [self.storyboard instantiateViewControllerWithIdentifier:@"MapViewController"]; 
MyMapViewController *mapViewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"MapViewController"]; 

更新證明駁回的容器視圖控制器。


這是一個子視圖控制器的方法,所以它可以用來消除它自己。

- (void)dismissFromParentViewController 
{ 
    [self willMoveToParentViewController:nil]; 
    [self.view removeFromSuperview]; 
    [self removeFromParentViewController]; 
} 
+0

非常感謝傑夫。真的很有幫助。只有一個問題,但這隻能在一個時間正確的嗎?所以你不能同時創建一個ViewController的多個實例。是對的嗎?所以我們可以說我有兩個相同的視圖控制器一次打開,他們都顯示相同的導入視圖控制器,那麼它不會正常工作? – Supertecnoboff 2015-03-25 12:14:18

+0

@Supertecnoboff,只要一個'view'只有一個'superview',你需要創建不同的實例,或者你可以將當前實例移動到你的可見容器中作爲'subview'。 – holex 2015-03-25 12:30:51

+0

有趣。因此,如果我創建不同的實例,我可以重複使用同一個視圖,可以在一個視圖中說5次?並且通過不同的實例,我正確地說,你只是意味着創建另一個新的指向視圖控制器的指針,如:'''MyMapViewController * mapViewController = ...;然後MyMapViewController * mapViewController_2 = ...; ''' – Supertecnoboff 2015-03-25 12:34:04

0

請嘗試以下方法:

  • 創建「映象控制器」超類繼承來的UIViewController並定義您的需要常用的方法和變量。
  • 將您的10個子類繼承到「地圖控制器」超類。並將常用的IBOutlets和IBActions連接到超類。
  • 您可以從子類(10視圖控制器子類)訪問常用方法和變量以超類。

請參考下面的代碼

@interface mapController : UIViewController 
{ 
    NSString *mapControllerVariables; 
} 
-(IBAction)mapControllerActions:(id)sender; 

@end 
@interface yourChileView : mapController 
{ 

} 
@end