2011-05-12 65 views
0

嘿傢伙想想一對夫婦的解決方案,但不是真的滿意他們,所以需要一些想法,請。什麼是切換視圖與UIViewController和UIViews沒有界面生成器的最佳方式是什麼?

我:

  • 3 UIView的實例廠景,視圖2,VIEW3
  • 1的UIViewController實例,UIViewController1存儲視圖1,視圖2和視圖3

我想:

  • 在view1中放置一個方法,它將告訴UIViewController1切換到view2。

我是否需要在view1中傳遞一個對UIViewController1的引用?這是唯一正確的方法嗎?

+0

只是出於興趣「目標 - 動作機制」和「委派」,爲什麼不界面生成器? – deanWombourne 2011-05-12 10:40:53

+0

我不確定你的意思是*引用UIViewController1到view1 *。嚴格的規則是不惜一切代價避免循環引用。如果'UIViewController1'知道'view1',那麼'view1'應該不知道'UIViewController1'。如果'view1'需要回傳,然後使用委託,目標 - 操作或通知,這些不是很難耦合的。 – PeyloW 2011-05-12 11:16:27

+0

抱歉,我的意思是參考UIViewController1 IN view1。 – valmo 2011-05-12 11:50:53

回答

2

首先,這些全屏視圖?如果是這樣,你應該考慮有3個視圖控制器,每個視圖一個,也許安裝在一個UITabBarController,這與你所描述的行爲類似。但無論如何:

不,視圖不應該告訴控制器做任何事情。

在MVC體系結構中,視圖呈現信息並接收(某些)用戶交互。控制者有責任決定如何處理該行爲。

視圖確實確實告訴控制器發生了交互。

所以你的主要問題是 - 什麼事件會產生這種行爲?

它是一個按鈕?按鈕(UIControl的子類)使用目標操作模式來處理這種通信。你的觀點應該向按鈕的引用:

@property (nonatomic, retain) UIButton *switcherButton; 

接下來,在視圖控制器,你會實現一個方法:

-(void)viewSwitcherButtonTapped:(id)sender; 

這是你的看法如何能告訴UI事件發生控制器。這就是它應該做的。控制器根據模型中的狀態信息或基於其自身的內部狀態或邏輯來決定當點擊該按鈕時應該發生什麼。

最後,創建視圖後,控制器將自身掛接到按鈕:

[view.switcherButton addTarget:self action:@selector(viewSwitcherButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; 

這樣任何視圖控制器可以使用該視圖,視圖不依賴於該參考控制器(因爲它不應該)。

但是,該按鈕只是一個示例,如果生成該行爲的事件不同,則您的實現可能會有所不同。回答這個問題,也許我可以修改這個答案來申請。

你應該看看

「模型 - 視圖 - 控制器設計模式」,在http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/CocoaDesignPatterns.html

+0

乾杯隊友。謝謝你指出我在正確的方向。 – valmo 2011-05-13 17:55:05

+0

如果您使用的是Interface Builder,那麼您不會錯誤的思考方向。它迫使你遵循@Ball解釋的適當的MVC。 – Mugunth 2011-07-17 13:54:32

0

你有2種選擇:

的快速和骯髒的一個:只需要聲明中指向的UIViewController每個視圖的屬性,把它定義爲分配以避免循環引用(我想你保留你的ViewController的看法)。那麼你可以通過這個屬性調用uiviewcontroller的方法

不錯的一個:讓每個視圖廣播一個通知,uiviewcontroller註冊這個通知,並在其回調中做它需要做的事情。

+0

謝謝。不好看看好的方式。我想這就是IB與IB交流時的工作方式。 – valmo 2011-05-12 11:59:51

+0

其實,IBActions不是通知,他們只是方法調用:) – deanWombourne 2011-05-12 12:41:42

相關問題