2011-08-05 37 views
17

我有一個UITableView,我想堅持一個44px子視圖的頂部。我試過tableViewHeader,但是和表格的其餘部分一起滾動。修復了UITableview的頭文件?

我試過搜索,發現很多人說我需要添加一個UIView superview,然後添加我的頭文件和UITableView。然而,我無法找到一個如何做到這一點的例子。我嘗試製作一個新的UIView子類並在IB中佈置子視圖,但是我遇到了麻煩,讓表控制器與UITable鏈接(因爲我對IB的瞭解不夠)。

我該如何做到這一點與XIBs?有人可以提供一個例子嗎?

感謝您提供任何幫助。

+0

[UITableView with fixed section headers]可能的重複(http://stackoverflow.com/questions/17582818/uitableview-with-fixed-section-headers) –

回答

34

我終於在帖子發佈後發現了這個問題。人物。 :)

下面是我做什麼,萬一別人遇到了同樣的問題:

  1. 刪除現有UITableViewController及其XIB。他們是垃圾。當你這樣做的時候真的很生氣。

  2. 創建一個新的UIViewController子與廈門國際銀行

  3. 打開廈門國際銀行在IB,並添加你的頭的東西,一個UITableViewUIView

  4. 在IB網點爲UITableView請確保您連接代表和數據源到您的文件所有者

  5. 在您的視圖控制器的標題中,一定要添加<UITableViewDelegate, UITableViewDataSource>來實現這些協議

  6. 實現你所熟悉和喜愛的所有常規UITableView委託和數據源的方法,但在你的UIViewController代替的方式你通過UITableViewController

用來做在此之後的事情應該工作。

+2

這應該是被接受的答案。重寫現有方法(如當前接受的答案)應該是最後的手段。 –

+11

但是,如果您需要將其作爲UITableViewController出於其他原因,則這並不能解決問題。 – Gujamin

+0

@PauldeLange你的意思是史蒂夫的回答?重寫現有方法有什麼問題? – Dejell

9

問題是,UITableViewController的view屬性和tableView屬性是一樣的。我有同樣的問題,想把一些固定的內容放在桌子上面。我不想改變基類,因爲它提供了許多我不想丟失或中斷的強大功能。

修復其實很簡單。訣竅是創建自定義設置並獲取self.tableView屬性。然後,在loadView中,用新的UIView替換視圖並將tableView添加到它。然後你可以自由地在tableView中添加子視圖。下面是它是如何做:

在標題:

@interface CustomTableViewController : UITableViewController 
{ 
    UITableView *tableView; 
} 

在.M:

- (UITableView*)tableView 
{ 
    return tableView; 
} 

- (void)setTableView:(UITableView *)newTableView 
{ 
    if (newTableView != tableView) 
    { 
     [tableView release]; 
     tableView = [newTableView retain]; 
    }   
} 

- (void)loadView { 
    [super loadView]; 
    //save current tableview, then replace view with a regular uiview 
    self.tableView = (UITableView*)self.view; 
    UIView *replacementView = [[UIView alloc] initWithFrame:self.tableView.frame]; 
    self.view = replacementView; 
    [replacementView release]; 
    [self.view addSubview:self.tableView];  

    //code below adds some custom stuff above the table 
    UIView *customHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)]; 
    customHeader.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:customHeader]; 
    [customHeader release]; 

    self.tableView.frame = CGRectMake(0, customHeader.frame.size.height, self.view.frame.size.width, self.view.frame.size.height - customHeader.frame.size.height); 
} 

享受!

+1

你怎麼說覆蓋現有的方法=你推薦它? – Dejell

+1

而這段代碼不適用於ARC – Dejell

+1

即使這樣做有效,在技術上也是錯誤的,因爲docs明確地聲明不要在loadView中調用'super'(這需要完成這個解決方案的工作)。 – Anthony

1

作爲一個選項,可以嵌入的UITableViewController作爲UI的一部分到另一的UIViewController與「容器視圖」元件(選擇一個在界面生成器從對象庫(其中所有其它視圖)) 。

這樣,您就可以使用的UITableViewController像普通視圖(在定位方面),並撰寫所需的任何佈局不overwritting現有的表視圖代碼

編輯:

進一步擴大我的答案,這裏有步驟來完成所描述的方法:

  1. 打開您在Interface Builder storyboar
  2. 支持拖放新ViewController元素到ST從Object Library的oryboard添加一個新的控制器。
  3. 作爲一個子視圖,從對象庫拖放Container View和任何地方它ViewController

  4. Container View內創建另一個視圖控制器和「嵌入」賽格瑞的連接。這是保存刪除這個viewcontroller和連接Container View與所需view controller(按照問題是的UITableViewController)

  5. 要連接Container ViewUITableViewController只需選擇container view和控制+拖動到的UITableViewController - 在選擇「嵌入」彈出式菜單

現在控制器將在Container View內顯示容器的位置和邊界。

有可能獲得一個到嵌入式視圖控制器的鏈接 - 系統將觸發主機viewcontroller的「prepareForSegue」方法(在上面的步驟1中創建),並且控制器位於segue.destinationViewController屬性中 - 可以自定義它按要求。只需確保在界面生成器中爲「嵌入」segue設置一個標識符 - 這與其他任何segues都是相同的過程。

+0

你能詳細描述你的答案如何去做你所說的話嗎? –

+0

@NiteshBorad請檢查我的更新答案 - 請讓我知道它是否涵蓋了足夠的流程 –

+0

我已經完成了您的答案更新。雖然,感謝您的快速響應。現在你的答案似乎很完美。有用。 –

1

用ViewController替換TableViewController,在裏面添加一個固定高度的UIView放置你需要的固定內容,在下面添加一個UITableView。

創建出口到您的TableView

@IBOutlet weak var tableView: UITableView! 

您可以重複你已經有了例如

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return data.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let c = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell! 
    c.textLabel?.text = "A title" 
    c.detailTextLabel?.text = "A subtitle" 
    return c 
} 

去除覆蓋字funcs中看到這個答案,如果你添加了自動刷新控制需要它Pull to refresh UITableView without UITableViewController

+3

如果您覺得這個問題是重複的,應該標記爲這樣。不要發佈鏈接到其他StackOverflow帖子作爲答案。 – JAL

+0

這個問題沒有重複,上面有人說沒有實現接受的答案的原因之一是因爲他們不能使用自動刷新控制,我正在顯示一種方法來使用它與接受的答案。我會在接受的答案中做一個評論,如果stackoverflow允許我這樣做,但我不能,因爲它要求50點的聲譽。 – iyepes

0

在故事板或xib中定義自定義UIView,在View Controller中爲該UIView提供IBOutlet引用。在-(void)viewWillAppear:(BOOL)animated方法編寫[self.tableView.superview addSubview:filterHeaderView];,這裏filterHeaderView是我的標題視圖的IBOutlet引用,我想添加爲我的tableview中的固定標題。