2010-07-20 94 views
1

我有我的iPhone應用程序中的分組風格的UITableView。 現在我想用圖像,標籤和活動指示器自定義節標題。如何在Interface Builder for iPhone中構建UITableView sectionHeader視圖?

爲此,我創建了一個新的UIViewController子類和一個XIB文件。我將UIImageView,UILabel和UIActivityIndi​​catorView作爲IBOutlet屬性添加到ViewController,並將它們連接到我在Interface Builder中放入XIB的控件。

在我的UITableView的類中,我設置了節標題(兩個,上面定義的ViewController的兩個實例)並設置它們的屬性(圖像和文本)。然後我返回的的tableView委託ViewControllers觀點:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    if (section == 0) { 
     return [favoritesSectionHead view]; 
    } else { 
     return [serverlistSectionHead view]; 
    } 
} 

這顯示我在Interface Builder中定義它,而無需自定義圖像和文字的觀點。 我知道爲什麼會發生這種情況(ViewController的視圖是在第一次需要時創建的,在我的代碼中這是當我在viewForHeaderInSection方法中返回時 - >當我試圖設置自定義值時視圖仍然爲零),但是我不知道如何解決這個問題。

你能幫我嗎?在退貨之前,我必須做什麼來初始化視圖? UITableView文檔告訴我不要手動調用「loadView」...

在此先感謝, 馬克。

+0

您可能希望從if()語句中取出返回值,它會引發警告,因爲編譯器在代碼中運行,它不像我們那樣遍歷步驟,所以它會到達並沒有得到「返回someObject」,並且它不知道你在結束之前已經拋出了一個值。我設置了一個tempObject:UIView * tempView; 然後,我將它設置爲等於它在if()語句中所需的值,就像在返回[favoritesSectionHead視圖]中一樣;然後在該方法結束時,我返回tempObject,如「return tempView;」沒有警告! – Newbyman 2010-07-30 02:06:52

回答

0

我不得不添加一個NSString屬性到我的剖視圖控制器。在viewDidLoad中,我將此字符串分配給UILabel文本屬性,現在它正在工作。

1

我有與視圖=(null)相同的問題。這完全是關於「代表」。我的tableView工作正常,所有我的UITableView委託方法正常工作,但viewForHeaderInSection:不會實現。

我發現Xcode讓我使用TableView的弱鏈接引用來構建,這對於「viewForHeaderInSection:」方法來說是不夠的。

我還發現,Xcode將輕鬆地從viewForHeaderInSection:方法中推送一個「編碼」自定義視圖,使用這個相同的弱引用,但使用IB,鏈接必須更加成熟。需要多一點工作,但是一旦你開始構建更復雜的對象,它會提供更好的體驗。我使用了:NSLog([NSString stringWithFormat:@"%@", self.headerView]);來驗證視圖輸出爲(null)。

viewForHeaderInSection:方法首先被調用,如果nil或null,則tableView調用下一個「titleForHeaderInSection:」。 (你也可以使用這個你的優勢)。

確保你的設置是正確的,並且對這些對象如何相互配合有意義。

樣的步驟,爲我工作:
(.H)


  1. 正確設置一個的viewController,並聲明的tableView委託方法。我正在使用通用的UITableViewController,在複雜的TabBar中並沒有爲我工作,並帶有UINavigationControllers。

    @interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate, UIAccelerometerDelegate> { 
    
  2. 創建所有IBOutlets,這將是對你的看法:

    IBOutlet UITableView *myTableView; 
    IBOutlet UIView *yourCustomHeaderView; 
    IBOutlet UIImageView *yourImageOnCustomView; 
    
  3. 分配內存分配指派:

    @property(nonatomic,retain) IBOutlet UITableView *yourTableView;  
        @property(nonatomic,retain) IBOutlet UIImageView *yourCustomHeaderView; 
        @property(nonatomic,retain) IBOutlet UIImageView *yourImageOnCustomView; 
    

(.M)


  1. 綜合您的變量:

    @synthesize yourTableView, yourCustomHeaderView, yourImageOnCustomView; 
    
  2. 實現所有標準的TableView委託所需的方法,再加上:

    -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    
        //Intialize the header View to present: 
        UIView *headerView; 
    
        //Display Section Headers for rows: 
        if (section == 0) {headerStatBar = self.yourCustomSectionHeaderView1;} 
        if (section == 1) {headerView = self.yourCustomSectionHeaderView1;} 
        if (section == 1) {headerView = self.yourCustomSectionHeaderView1;} 
    
        //Return the view to the Table: 
        return headerView; 
    } 
    
  3. 請在IB所有連接,最簡單的方法:

    1. 用「LIST」查看您的對象VIEW「,提供更好的理解和對象層次結構
    2. 右鍵單擊」文件所有者「,顯示所有IBOutlet;
    3. 將所有IBOutlet連接從文件所有者拖到它們控制的對象;即(yourTableView - >的tableView)或yourCustomHeaderView - >自定義視圖,你設計)和(yourImage - 你掉在您的自定義視圖>自定義的UIImageView

現在,連接完成通過設置該項目的任何屬性,例如self.yourCustomHeaderView.background = [UIColor redColor]; etc....

**請確保您從「TableView」拖動到「文件所有者」來設置表格的(委託)和(數據源)返回到文件的所有者;恰好是所有tableView委託所在的位置方法是!


這只是最簡單的步驟,就可以使視圖複雜,因爲你需要它,一個我viewForHeaderInSection的:觀點有40+ IBoutets所有的意見,其中包括按鈕,圖像,標籤,其他意見等...


真的試圖保留'代碼塊'中的所有代碼,只是不會工作,但你仍然可以閱讀它。

+0

嗨Newbyman,謝謝你的非常詳細的答案。 正如你在上面的答案中看到的,我的問題是一個不同的問題(我沒有正確地遵循MVC模式),但我相信別人會遇到你的解決方案適合的問題,並很樂意在這裏找到它! – Cornelius 2010-08-04 10:31:43

1

您的看法尚未加載。這就是爲什麼它是零。在ViewDidLoad中執行修改代碼。

我有一個類似的問題,我試圖在初始化標題後編輯標籤值,但我但標籤都是零。我通過調用標題視圖控制器的viewDidLoad方法中的標籤修改代碼來解決問題。

相關問題