2012-05-02 31 views
2

我需要幫助,瞭解如何從UIViewController中抽象出只是交互。對於所有的意圖和目的,比如我有一個視圖控制器來控制一個謎題。我有一系列的片斷視圖,拼圖板視圖(放置棋子的地方)以及其他一些視圖。現在我有了那些拼圖的典型泛式互動。如何從UIViewController中抽象出交互?

我需要做的是抽象出這種交互作用,以便我可以通過點擊按鈕或調用方法完全改變整個系統的「交互模式」,也就是說,切換前的所有其他狀態。例如,不用用手指拖動棋子,而是在切換之後,他們必須「選擇」一塊,然後用陀螺儀重力滑動它。

我對iOS很新,實際上一般都沒有OO的經驗,所以我真的希望有更多經驗豐富的人員給我建議,以免我的代碼弄糟了。 (是的,我會採取一個快照,但我還是感到很緊張。)無論如何,我想也許我應該做這樣的事情:

  • 有將保持強勁的指針我的意見根視圖控制器和照顧相關
  • 有在根視圖控制器的交互控制器的指針,其職責是處理所有交互代碼
  • 交互控制器將獲得通過委託其觀點從根視圖控制器一切非互動通過授權運行時間並將任何手勢識別器等附加到視圖中viewDidLoad
  • T他的交互控制器將在運行時切換出來。可接受的交互控制器對象將來自我爲此定義的一些UIInteractionViewController的子類。

我不知道這是否會

一)實際工作

B)是最好的方式做到這一點

C)足夠快,以真正在運行時

工作

d)可擴展(我可能需要許多這些不同的'模式')。

其實,我看的越多,我越懷疑它的意義。幫助,令人愉快。

謝謝!

回答

0

好問題。

從我的角度來看,面向對象是應用程序開發的一個關鍵點。很多應用程序開發人員根本沒有太多的面向對象的經驗,這導致了很多關於SO的誤解,煩惱,奇怪的問題和答案。首先,對Cocoas框架的基本架構以及如何使用它們缺乏瞭解,因爲這些框架在許多方面都遵循繼承和對象組合的思想,並且使用OO模式。這種缺乏會導致對框架的廣泛爭論和/或(當學習第一個OO課程時)在面向對象概念方面完全過度工程。

對於你的問題:看來你已經瞭解了基本的面向對象原理,以瞭解框架內部發生了什麼。現在你應該意識到保持簡單。你的益智遊戲聽起來就像一個典型的應用程序:你單獨工作或者幾個人一起工作,整個代碼庫將會很小,不是一個庫,它的生命週期將會更短,一旦完成,你將修復錯誤並且擁有小的改進,但不適應完成新的環境等等。所以我不認爲你應該大量使用OO模式來解決問題中描述的問題(儘管我猜所描述的解決方案會起作用)。

我會做這樣的事情:

  1. 讓你puzzel的視圖控制器做的所有事件由 實現所有的事情處理需要,如:

    touchesBegantouchesMovedtouchesEndedaccelerometer:didAccelerate:

  2. 給這個控制器一個模式,並按下按鈕開關它:

    int controlMode; // in PuzzleController.h

  3. 交換機上的控制模式,在你的事件處理是這樣的:

例子

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    switch (controlMode) 
    { 
    case ControlModeDrag: 
     touchedPiece = [self findPiece:event]; 
    case ControlModeGravity: 
     //do nothing; 
    case ControlModeSomethingElse: 
     // whatever 
    default: //... 
    } 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    switch (controlMode) 
    { 
    case ControlModeDrag: 
     [self moveTouchedPiece:event]; 
    case ControlModeGravity: 
     //do nothing; 
    case ControlModeSomethingElse: 
     // whatever 
    default: //... 
    } 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    switch (controlMode) 
    { 
    case ControlModeDrag: 
     touchedPiece = nil; 
    case ControlModeGravity: 
     touchedPiece = [self findPiece:event]; 
    case ControlModeSomethingElse: 
     // whatever 
    default: //... 
    } 
} 

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
{ 
    switch (controlMode) 
    { 
    case ControlModeDrag: 
     //do nothing 
    case ControlModeGravity: 
     [self moveTouchedPiece:accelaration]; 
    case ControlModeSomethingElse: 
     // whatever 
    default: //... 
    } 
} 
+0

嗯。好的,是的,我明白你關於保持簡單的觀點。其實我真的很想避免開關語句,大聲笑,但它確實會更直接。使用controlMode屬性,您的解決方案也可以保持事物的美好和乾淨。我想我會按照你描述的方式去做。非常感謝你的幫助! – mwiederrecht