2013-02-13 90 views
1

我是Xcode的新手,並開始一個通用的應用程序。在iPad版本中,我想重新使用不同搜索表單的主要部分。Xcode最好的方式來重複使用多種形式的區域/視圖

我希望用戶在左側菜單中的每個按鈕的右側部分中看到完全不同的窗體(請參見圖像)。

我以編程方式工作。

enter image description here

什麼來改變這種情況下的內容的最好方式? (注意性能和編碼的複雜性)

編輯:這是一個標準的選項卡式應用程序,而不是分割視圖。我可以爲每個表單添加一個新的視圖控制器和.xib,然後通過將其嵌入到此屏幕上的UIView或UIWindow中來更改顯示哪一個?

回答

2

您在編輯中遇到了正確的答案。據我所知,側面的按鈕與另一個標籤欄控制器類似,但嵌套在主標籤欄控制器中?

你可能會遵循相同的模式,因爲它是一個熟悉的模式。您的搜索視圖控制器應該充當container view controller,這將有一個視圖控制器數組代表每個表單選項。

當你的選項之間進行切換,增加/(使用addSubview)(在「添加和刪除一個孩子」的鏈接使用的代碼)視圖控制器層次結構中刪除從您的視圖層次相應的視圖控制器的看法。視圖控制器層次結構對於確保在您的子控制器上調用viewDidAppear等非常重要。

作爲一個例子,我創建了一個簡單的演示項目,其中主視圖控制器有一組按鈕,每個按鈕都鏈接到相同的動作,以及一組包含的視圖控制器。包含的視圖控制器將保存在子視圖內,在此示例中稱爲container。這將是上面截圖中右側區域的大小。

子控制器設置爲容器視圖控制器的viewDidLoad如下:

@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *buttons; 
@property (weak, nonatomic) IBOutlet UIView *container; 

@property (nonatomic,strong) NSArray *viewControllers; 
@property (nonatomic, strong) UIViewController *currentChild; 

@end 

@implementation JRTViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    for (UIButton *button in self.buttons) 
     [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; 

    NSMutableArray *children = [NSMutableArray new]; 

    for (int i = 0; i < 4; i++) 
    { 
     ContainedViewController *child = [ContainedViewController new]; 
     child.name = [NSString stringWithFormat:@"Form %d",i + 1]; 
     [children addObject:child]; 
    } 

    self.viewControllers = [children copy]; 
    [self buttonTapped:self.buttons[0]]; 
} 

在這裏,我使用了相同的觀點控制器類的四個實例 - 所有它是一個標誌,顯示其你正在選擇的形式。真的,每個人都有不同的課程。我還通過發送第一個按鈕的操作方法來「選擇」初始視圖控制器。操作方法是這樣的:

- (IBAction)buttonTapped:(UIButton *)sender 
{ 
    NSUInteger index = [self.buttons indexOfObject:sender]; 
    if (index != NSNotFound) 
     self.currentChild = self.viewControllers[index]; 
} 

它從視圖控制器陣列中選擇適當的VC。 setter方法執行此操作:

-(void)setCurrentChild:(UIViewController *)currentChild 
{ 
    if (currentChild == _currentChild) return; 

    // Remove the old child 
    [_currentChild willMoveToParentViewController:nil]; 
    [_currentChild.view removeFromSuperview]; 
    [_currentChild removeFromParentViewController]; 
    [_currentChild didMoveToParentViewController:nil]; 

    // Add the new one 
    [currentChild willMoveToParentViewController:self]; 
    [self.container addSubview:currentChild.view]; 
    NSDictionary *views = @{@"view":currentChild.view}; 
    [self.container addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[view]|" options:0 metrics:nil views:views]]; 
    [self.container addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:views]]; 
    [self addChildViewController:currentChild]; 
    [currentChild didMoveToParentViewController:self]; 
    _currentChild = currentChild; 
} 

設置視圖控制器層次結構,添加視圖並使用約束使其填充容器。

在這個例子中,我已經硬編碼了四個按鈕和四個子視圖控制器,因爲我演示了子視圖控制器的添加和切換。實際上,你會更像是一個標籤欄控制器,在其中分配視圖控制器的數組,並且容器將自己創建一組按鈕。

+0

我認爲你的「容器視圖控制器」鏈接是朝着正確方向邁出的一步。當您不知道要搜索什麼內容時,很難在iOS文檔中找到相關內容。我現在將通讀它。 – PaulMrG 2013-02-17 10:22:31

+0

我理解這個概念,但可以通過一些幫助來實現。有沒有任何教程?還是很容易在這裏展示一個簡單的例子? – PaulMrG 2013-02-17 15:44:51

+0

今晚我會在這裏舉一個例子。如果有什麼特別的,你沒有得到,請編輯您的問題或添加評論,我會確保我覆蓋它。 – jrturton 2013-02-17 16:49:09