2012-01-24 79 views
0

我的viewController有一個.xib文件。它包含一個TableView和一個UIView。 UIView由一個自定義類 - CommentsBarView(試圖在我的tableView下面放置一個帶有註釋字段的小欄)支持。自定義類的IB子視圖的設置/實例化

所以在我的文檔大綱名單上有:

  1. 視圖
    • 的tableView
    • 評論欄視圖
      • 的UITextView
      • 的UILabel

「評論欄視圖」的自定義類是CommentsBarView。

我有從評論欄視圖連接到文本框和標籤的插座。 (並從ViewController到tableView)。

當我打開我帶控制器:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 

我可以訪問的tableView財產和改變的tableview的外觀,但是,從我commentsBarView的initWithCoder我不能設置我的TextView文本值和標籤:

- (id) initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 

     [self.commentTextView setText:@"Helo, World!"]; 
     [self.characterCountLabel setText:@"200"]; 
    } 

    return self;  
} 

看起來好像這些屬性在initWithCoder時間不可用。

如果我從我的控制器initWithNibName手動訪問self.commentsBar.label.text = 200,則沒有問題。

我是否遇到過視圖尚未準備好的時間問題,或者我是否可以在viewControllers視圖中嵌套視圖並使其支持自定義UIView子類?

IB讓我困惑了一下。

感謝您給予的任何幫助。

回答

2

從XIB文件加載時,IBOutlets尚未準備好在要存檔的對象的init方法中。

您需要在您的評論欄視圖中覆蓋awakeFromNib才能訪問就緒和連接的IBOutlet。

+0

謝謝,那正是發生了什麼事。 – RickiG

0

一旦你習慣了IB,它會變得更好。由於Cocoa是一個MVC(模型 - 視圖 - 控制器),所以你可能不應該創建一個UIView子類並將它設置爲UIView。你應該把UIView放回到UIView。如果我需要定製外觀,我通常會劃分UIView的子類。例如;如果你想讓它具有漸變,UIView子類的好時機。然後,您可以將您的子類用於任何想要顯示漸變的UIView。

在你的情況下,你試圖「控制」UITextView和UILabel。您可以直接將UITextView和UILabel的插座連接到您的UIViewController(文件所有者)。在這種情況下,這是MVC的「控制器」。把你的UIView想象成一個容器,它只是爲這個例子持有兩個控件。現在,您可以使用viewDidLoad方法或您的其他UIViewController方法來設置您的UITextView和UILabel的值。通常UIVeiwController會解釋來自Cocoa模型的數據並將數據放置在需要的地方。這不是一個堅如磐石的規則,而是一個很好的規則。

+0

嗨,羅布,感謝您的回覆。如果IB沒有提供封裝自定義視圖組的可能性,我絕不會考慮使用它。原來我只是在訪問元素太早,我當然可以不指望它們在調用viewDidLoad之前做好準備。 – RickiG

+0

是的時機就是這方面的一切。 – Rob

相關問題