2011-08-23 64 views
2

所以我有一個有趣的設計問題,關於我正在開發的iPhone應用程序。我正在創建一個操縱圖像的應用程序,並且可以執行不同類型的操作。因此,用戶打開應用程序,並選擇他們想要執行的操作類型,並通過一步一步的過程來執行操作。有關iOS應用程序的複雜設計問題

很多操作都很相似,所以代碼可以在這裏重用。因此,我決定創建一個視圖和一個視圖控制器,而不是爲每個操作的每個窗口創建一個視圖控制器。該視圖包含每個圖像操作的步驟,並且每次增加到下一個步驟時,都會適當地重新組織它自己。視圖控制器由導航控制器控制,並且每次用戶前進到他們嘗試執行的任何圖像操作的下一步(即將新的視圖控制器推到堆棧上)時,我複製了我的視圖對象,將其設置爲將其組件重新組織到適當的步驟,然後將其發送到將顯示它的新視圖控制器。所以我的問題是,對於操作的一些階段,我需要添加一些按鈕到一個通用的工具欄,它連接到視圖控制器(因爲這是一個模態視圖,這個工具欄將有一個主頁按鈕,將使用戶能夠退回到主屏幕)。基本上,我有幾個問題應該如何處理:

1)我應該簡單地將工具欄添加到我正在使用的視圖中,而不是視圖控制器。如果是這樣,我怎麼會有工具欄上的主頁按鈕退出模態視圖?

2)我應該保持視圖控制器上的工具欄,並讓我的視圖返回一組按鈕來加載視圖時添加到它?那麼我想我必須在我的視圖控制器中列出所有的操作方法?

3)我應該保持視圖控制器上的工具欄,但從工具欄發送指針到我的視圖對象,然後添加按鈕在我的視圖類?我可以在我的視圖類中添加我的動作方法嗎?

無論如何,對不起,如果這是複雜的,如果你有任何後續問題,請讓我知道。

+0

在整個過程中工具欄是否存在?如果是這樣,最好在另一個筆尖中創建一個嵌套視圖控制器。通過這種方式,您可以在頂部顯示一個不改變的工具欄(關於其指針位置),而下面的區域可以根據需要通過其自己的視圖控制器進行修改。 – justin

+0

我創建的每個視圖控制器對象都具有相同的工具酒吧(有一個主頁按鈕)。我想只有一個工具欄,因爲屏幕空間對我的應用很重要。我甚至都不知道你可以嵌套視圖控制器,那麼在視圖中如何更好/不同呢? –

+0

這與使用基於導航的應用程序基本相同。頂部的酒吧始終在場,讓您從視圖中瀏覽。如果您使用類似的方法,您可以保留對該欄的靜態引用,允許您根據需要添加/刪除。然後,從您傳遞的每個視圖開始,可以通過類似於「self.root.toolbar」的調用來獲取工具欄,如果有意義的話。無論如何,這是我會做的。它使傳遞信息和跟蹤你的視圖更容易 – justin

回答

0

我終於想出了一個解決方案。我所做的是創建一個名爲UIMainViewController的通用視圖控制器,它顯然是從UIViewController繼承的。我實現工具欄類似如下:

- (void) viewDidLoad 
    { 
     [super viewDidLoad]; 

     [self assembleToolbarButtons]; 
     [[self navigationController] setToolbarHidden:NO]; 
     [self setToolbarItems: toolbarButtons]; 
     [[[self navigationController] toolbar]setBarStyle:UIBarStyleBlack]; 
    } 

    - (void) assembleToolbarButtons 
    { 
     NSMutableArray *toolbarButtonsTemp = [[NSMutableArray alloc] init]; 
     [self setToolbarButtons: toolbarButtonsTemp]; 
     [toolbarButtonsTemp release]; 

     if ([self mode] == UIMainViewControllerMainMode) 
     { 
      UIBarButtonItem *createAPictureButton = [[UIBarButtonItem alloc] initWithTitle:@"Create" style: UIBarButtonItemStyleBordered target:self action:@selector(loadCreateAPictureModalViewController)]; 
      UIBarButtonItem *accountButton = [[UIBarButtonItem alloc] initWithTitle:@"Account" style: UIBarButtonItemStyleBordered target:self action:@selector(loadAccountModalViewController)]; 
      UIBarButtonItem *helpButton = [[UIBarButtonItem alloc] initWithTitle:@"Help" style: UIBarButtonItemStyleBordered target:self action:@selector(loadHelpModalViewController)]; 

      [[self toolbarButtons] addObject: createAPictureButton]; 
      [[self toolbarButtons] addObject: accountButton]; 
      [[self toolbarButtons] addObject: helpButton]; 

      [createACaptionButton release]; 
      [accountButton release]; 
      [helpButton release]; 
     } 
     else 
     { 
      UIBarButtonItem *homeButton = [[UIBarButtonItem alloc] initWithTitle:@"Home" style: UIBarButtonItemStyleBordered target:self action:@selector(exitModalViewController)]; 

      [[self toolbarButtons] addObject: homeButton]; 

      [homeButton release]; 
     } 


    } 

-(void) loadCreateAPictureModalViewController 
{ 
    CreateAPictureViewController *createAPictureViewController = [[CreateAPictureViewController alloc] initWithMode:UIMainTableViewControllerModeModal]; 
    UINavigationController *createAPictureNavController = [[UINavigationController alloc] initWithRootViewController: createAPictureViewController]; 

    [[createAPictureNavController navigationBar] setBarStyle:UIBarStyleBlack]; 
    [self presentModalViewController:createAPictureNavController animated:YES]; 

    [createAPictureNavController release]; 
    [createAPictureViewController release]; 
} 

-(void) loadAccountModalViewController 
{ 
    AccountViewController *accountViewController = [[AccountViewController alloc] initWithMode:UICaptionDistractionTableViewControllerModeModal]; 
    UINavigationController *accountNavController = [[UINavigationController alloc] initWithRootViewController: accountViewController]; 

    [[accountNavController navigationBar] setBarStyle:UIBarStyleBlack]; 
    [self presentModalViewController: accountNavController animated:YES]; 

    [accountNavController release]; 
    [accountViewController release]; 
} 

-(void) loadHelpModalViewController 
{ 
    HelpViewController *helpViewController = [[HelpViewController alloc] initWithMode:UICaptionDistractionTableViewControllerModeModal]; 
    UINavigationController *helpNavController = [[UINavigationController alloc] initWithRootViewController: helpViewController]; 

    [[helpNavController navigationBar] setBarStyle:UIBarStyleBlack]; 
    [self presentModalViewController: helpNavController animated:YES]; 

    [helpNavController release]; 
    [helpViewController release]; 
} 

-(void) exitModalViewController 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

所以我的應用程序,每個視圖 - 控制它會在有創建圖片,訪問帳戶,或訪問幫助基本按鈕底部的工具欄。如果其中一個按鈕被訪問,它將啓動一個模式視圖,該模式視圖將具有主頁按鈕以退出模式視圖(當創建UIMainViewController時,其中一個參數告訴它它處於哪種模式,以及哪個工具欄按鈕添加

但主要是我創建了一個類mutablearray varialbe來存儲工具欄按鈕,然後在「assembleToolbarButtons」中創建按鈕現在任何從UIMainViewController繼承的類都可以重載assembleToolbarButtons以添加它自己的在已經添加的主要按鈕之上的按鈕

至於我最初提到的使用一個UIView並重新組織它自己,並且只有一個uiviewcontroller,我避免了這個,而是創建了separa爲每個步驟和獨立視圖添加視圖控制器,以便更多地遵守MVC。

0

1)好的。

對於解僱,你的觀點有一個指向視圖控制器的指針?怎麼樣這樣的事情:

[self.viewController.parentViewController dismissModalViewControllerAnimated:YES]; 

不知道我是否明白你的層次結構如何組織。這只是我的猜測。

2)這對我來說似乎很笨拙。你必須定義某種數據結構來描述視圖在按鈕中所需的內容,並列出它們的列表。視圖控制器必須請求該列表,並通過它們。

3)這似乎是最好的選擇。但我不會讓你的視圖直接添加子視圖到工具欄。創建一個ToolbarView自定義視圖。給它一些addButton方法,用參數描述你想要的按鈕的基本屬性,比如標題,目標和動作。讓ToolbarView決定它的外觀,它的位置等。

您的操作方法可以放在您的視圖類上嗎?是的,我想,但他們不應該。推薦的iPhone設計模式是,視圖不應該什麼,他們應該只是顯示的東西。做事的方法應該在視圖控制器上,即使他們所做的唯一的事情是改變顯示的視圖。

+0

我實際上沒有一個指向我的父視圖控制器的指針,但最終我認爲如果我把工具欄放在視圖本身內,我想我會這樣做避免。所以你說的是,如果我在我的視圖類中創建按鈕,並將它們返回給我的視圖控制器,然後將我的操作方法放在我的視圖類中,它會知道哪裏仍然可以找到它們? –