2011-12-18 201 views
6

我有一個帶有自定義節標題的tableview。節頭的視圖在故事板中定義並連線到實例變量。有沒有辦法從故事板中請求視圖的新實例?從故事板中重用視圖

在過去,我已經通過在其自己的XIB文件中定義節頭並獲得一個新的實例使用

[[NSBundle mainBundle] loadNibNamed:@"TimerViewSectionHeader" owner:self options:nil]; 
UIView *newHeaderView = self.sectionHeaderView; 

回答

3

我不」認爲是有辦法做到這一點做到了這一點。最好的辦法是將tableview自定義標題視圖放在一個單獨的nib中,並在需要使用時像你在代碼示例中那樣加載它。

+0

+1 from me。我花了數小時試圖弄清楚如何執行表格標題視圖的Storyboard方式,因爲我認爲Storyboard是佈局應用程序界面的新的改進方式。不幸的是,使用Storyboard無法在這個部門交付,最好的解決方案是回到以前的方式來爲視圖加載一個筆尖或者通過代碼構建視圖。我真的很想相信我的應用程序的所有UI都可以在一個Storyboard文件中完成,但事實絕非如此。 – ozz 2012-01-12 19:55:50

0

我已經能夠在故事板中重用一個視圖,只需將一個tableview的轉換連接到我想要重用的視圖。

所以我希望重用的tableview被指向兩次。 它的工作,但我遇到它的問題,在我的應用程序委託中設置一個變量(使用instantiateViewControllerWithIdentifier)到我的表視圖,正在得到重用。 看來,如果我重用它,故事板正在創建2個我的tableview實例,而我通過instantiateViewControllerWithIdentifier獲得的實例並不是我想要的。

我不確定這是否是正確的方法。但我認爲其他許多人正在以某種方式做這件事。使用故事板中的自定義表格單元格,我懷疑很多人想重複使用他們的視圖。

3

我試圖做同樣的事情,並遇到同樣的問題。

我喜歡與故事板一起工作,並留下深刻的印象,我可以創建一個工作用戶界面的速度有多快。但是,只要您需要重新使用視圖,將它們與UIViewController子類一起放入單獨的筆尖中就很有意義。

然後,您可以將一個通用UIView在所有的地方,你再使用視圖應該去使用你的ViewController添加視圖:

[myReusableViewController loadView]; 
[myReusableViewController viewDidLoad]; // You have to handle view callbacks yourself. 

[self.myReusableViewPlaceholder addSubview:myResusableViewController.view]; 
[myReusableViewController viewWillAppear:YES]; 

所以總結起來:

  • 使用故事板,很棒
  • 在故事板中創建應用程序的腳手架以及任何靜態視圖(如關於屏幕等)
  • 在自定義筆尖中創建重用視圖+ UIViewController子類,並在故事板中添加UIView佔位符。

在另一個答案,我想到了一些Pros and Cons of Storyboard

+0

你確定你必須自己調用回調函數 - 對於我來說,看起來很怪異 – Rhubarb 2012-11-14 18:05:58

+0

然而,對於使用UIView作爲佔位符的想法,還是+1。請注意,您可以將它與上面的Krejko的答案結合起來,而不是從一個筆尖加載控制器,從故事板加載它(您可以使用一個故事板來保存一堆雜項視圖) – Rhubarb 2012-11-14 18:07:30

+0

@Rhubarb我不是100%確定你必須自己做回調,但如果你嵌入視圖,那麼你有責任調用它,看起來。請注意,在iOS6.0中,有一種新機制可以使用Embed Segue將整個ViewController嵌入到當前視圖控制器的某個區域中。這也可能是一個選項。 – Besi 2012-11-15 09:30:54

3

的解決方案,我想出了這個如下:

我有一個顯示覆雜數據的多個原型細胞的tableview。細節視圖和事務處理視圖有一個segue。

這第一個tableview有一個搜索按鈕,顯示一個新的tableview和結果。它需要與推動它的主桌面相同的功能;包括細節和交易進度視圖如下:

在故事板上,選擇並複製主桌面視圖。取消選擇並粘貼。從你的主tableview創建一個push segue到你的第二個tableview;或從任何你想從中導航的地方。根據需要修改第二個tableview。 IE:如果它需要一些UI更改沒有問題。

創建一個新的viewcontroller類,它是運行主表視圖的viewcontroller的子類。

覆蓋子類中的數據委託來提供所需數據的子集。

回到故事板,選擇你的第二個tableview控制器,並在身份檢查器中選擇你的子類作爲自定義類。

爲使此解決方案順利運行,您的應用程序確實需要管理視圖的數據。您可以使用prepareforsegue將數據從第一個tableview傳遞到第二個,但是從衆多的角度來看,我發現應用程序數據模型更加靈活。

除非你有通過segue推送到子視圖的按鈕,否則你的子類將需要重載通過具有身份的segse推送的函數。注意:如果您身份證明的話,Segmentation必須有唯一的標識符。

弄清楚這一點需要花費大量的試驗和錯誤,但是一旦你理解了這個概念,它就是一個相對平滑的解決方案,具有很強的適應性,並且不會太糟糕。

3

我不確定關於視圖,但我能夠將視圖控制器從我的視頻板中取出的方式如下。

UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"IdentifierName"]; 

從這裏,也許你可能能夠使用這種方式來類似於它曾經用過的筆尖。

+0

這應該被標記爲正確的答案 – Yariv 2013-05-10 17:19:58