2009-12-16 34 views
6

在iPhone上實現類似Web應用程序的選項卡的最佳方法是什麼?請注意下面的截圖(注意「Checkin-Info-Friends」選項卡)?這些不是UIKit標準庫的一部分,但最近似乎很常見。用於iPhone的類似Web的選項卡

我花了相當長的時間爲iPhone開發應用程序,但沒有開發像那樣的控件。這裏最好的辦法是什麼:

  • 爲每個標籤內容創建一個新的UIView,並立即將三個子視圖添加到主視圖?
  • 僅當用戶點擊每個選項卡時才創建新的UIViews?
  • 把所有的內容放在一個UIScrollView中,只需要在用戶點擊每個標籤時更改頁面?

也許這裏有開源的控件嗎?我找不到任何東西。

alt text http://www.foursquaregame.com/foursquare-game-images/foursquare-game-mobile-app.jpg

回答

3

我對類似問題的方法是讓所有4個(對我來說)選項卡上的意見,但釋放所有,但當前選項卡以didReceiveMemoryWarning迴應。 (當然,當用戶選擇一個新選項卡時,您必須確保創建新視圖(如果它不存在)。)

我認爲這是一個很好的折衷方案 - 對(在我的例子中,內存佔用是最低的),然後對低內存做出響應以避免被槍殺。

+0

所以你會有一個tabviewcontroller,但4個視圖,每個包括「思考咖啡」和標籤(從上圖)? – 2009-12-17 01:13:32

+0

在你的情況,我會有1個tabview控制器,一個基本視圖與「思考咖啡」,然後3個較小的選項卡視圖的屏幕下部,每個選項卡一個。 (如果選項卡視圖不是全屏幕,則保存內存。) – 2009-12-17 11:50:28

+0

(儘管這個決定對我來說很簡單,因爲我的每個tabviews只是有一些按鈕 - 所以在所有選項卡視圖中使用相同的視圖控制器很簡單 - 邏輯只是簡單的按鈕操作方法。) – 2009-12-17 11:52:23

1

我認爲最好只是在父視圖或視圖控制器中有三個UIView *對子視圖的引用,全部初始爲空,然後讓子例程隱藏其他兩個視圖(如果它們可見並且構造和顯示)或只是展示新的觀點。假設沒有特別的內存要求。

我認爲在子視圖級別上這樣一個小屏幕區域的加載/卸載問題不太可能成爲問題,但是如果需要加載/卸載父視圖,子視圖應該都會被隱藏和卸載),並且在重載時,loadView應該在啓動時調用最後一段中描述的例程。

如果實際上有三個子視圖中的任何一個使用了大量的內存或資源,那麼我的建議就會顛倒過來,並且每個子視圖和/或其背後的任何內存密集型對象都不應該隱藏起來,儘可能卸載。我認爲在那裏使用谷歌地圖時,隱藏時需要卸載可能適用於此。

這是正確的點嗎?是否有一些額外的細節我錯過了?

1

你可以讓每個選項卡成爲一個真實的視圖控制器與筆尖和一切。唯一的問題是,你必須轉發你想要接收的標準視圖控制器調用(viewWillAppear等),但它使得編碼更加清晰,因爲你的代碼就像你對任何其他視圖的編碼一樣(儘管對於更小的空間)。

您可以調用每個控制器的「視圖」屬性以獲取視圖,您將視圖添加爲您在選項卡下的容器視圖的子視圖。

1

如果所有這三個都是表格視圖,那麼您可能會忽略使用單個UITableViewController,它會根據所選標籤更改內容。否則,我第二次KHG的評論是使用真實視圖控制器來備份每個子視圖。

對於標籤本身,考慮繼承UISegmentedControl

+0

謝謝你的回答,弗蘭克。並非所有的觀點都是表格,我應該提到這一點。 UISegmentedControl的好主意。 – 2009-12-17 01:11:48

+0

嗨弗蘭克,我想不出如何繼承UISegmentedControl並替換繪圖方法,輸出我自己的圖像..你會有任何想法我應該重寫哪種方法? – 2009-12-18 01:58:51

+1

我沒有很多(好,任何)體驗子類的UI元素。您可以重寫'drawRect'方法,使用'[super widthForSegmentAtIndex]'獲取寬度和'[super selectedSegmentIndex]'來找出哪一個要突出顯示。你也可以走子視圖樹,並告訴任何UILabel畫自己。但是我不確定你在沒有記錄的API拒絕領域之前能走多遠。 – 2009-12-18 18:06:29

相關問題