2009-10-05 49 views
0

有人可以請適當的方式從我的文件加載視圖層次學校我。我使用加載的視圖作爲模板來消除一系列視圖,並且我正在使用的當前方法被巧妙地打破。我不應該在我應該的時候複製或保留。下面是相關的代碼:IB和UIView。從nib加載視圖層次結構的正確方法是什麼?

// pageSet is a list of view tag numbers I'll be using 
for (NSNumber *n in pageSet) { 

    NSUInteger viewTag = [n integerValue]; 

    // Ingest the nib. Should there be a copy or retain here? 
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"RandomStripe" owner:self options:nil]; 

    // Pull the view from the nib. Should there be a copy or retain here? 
    MyView *view = (MyView *)[topLevelObjects objectAtIndex:0]; 

    // The view has a label as it's subview 
    UILabel *pageNumberLabel = [view.subviews objectAtIndex:0]; 
    pageNumberLabel.text  = [NSString stringWithFormat:@"%d", viewTag]; 

    CGFloat xOffset = ((float) viewTag) * self.scrollView.bounds.size.width; 

    view.frame = CGRectMake(xOffset, 0, self.scrollView.bounds.size.width, self.scrollView.bounds.size.height); 
    view.tag = viewTag; 

    // Insert the view as a child of my containerView 
    [self.containerView addSubview:view]; 

} // for (pageSet) 

這讓我的頭受傷了嗎?

乾杯, 道格

回答

2

如果您使用的界面生成器返回到您的代碼中IBOutlets,事情會更容易一些。這樣,一旦你嘗試訪問你設置的UIView出口,它就會被加載,並且它的所有孩子都會被加載,然後UIView的initWithCoder會被調用(如果你已經子類化的話)。

@property (retain, nonatomic) IBOutlet iiView *iiView; 

否則,我這樣做:

if (self.numberView == nil) { 
    NumberView *numView = [[NumberView alloc] initWithNibName:@"NumberView" bundle:[NSBundle mainBundle]]; 
    self.numberView = numView; 
    [numView release]; 
} 

(有一個IBOutlet爲numberView,我先走一步,開始使用的,而不是上面的代碼numberView)

在這兩種情況下,都numberView的子視圖 - 子視圖將同時加載。如果我需要訪問一個標籤或按鈕,我會爲這些人做一個IBOutlet,所以我不必遍歷查看它們的視圖層次結構。

IBOutlet UIButton *nextButton, 
      *stopButton1, 
      *stopButton2, 
      *infoButton, 
      *bitsonthegoButton; 
IBOutlet UILabel *pointsLabel1, 
     *pointsLabel2, 
     *totalPointsLabel1, 
     *totalPointsLabel2; 
0

我不知道,如果對方的回答是在這一點十分清楚,但你建立你的看法任何IBOutlets將獲得與相同loadNibNamed有線在:叫你今天做的。因此,在該視圖的標題,你會宣告兩個MyView的和pageNumberLabel IBOutlets,然後將它們連接到文件的所有者在廈門國際銀行(並設置文件的所有者類型爲你調用loadNibNamed的觀點:從)。

這只是爲了讓您的生活更輕鬆。要回答你問的問題,該文件「loadNibNamed:所有者:選擇」告訴我們:

您應保留或者返回 陣列或者它包含 手動防止筆尖文件被 的物體上,提前發佈 。

因此,數組是自動釋放的,並且其中的所有對象也是如此(您期望從調用返回一個自動釋放數組)。既然你想保留視圖,你應該保留這一點 - 這樣做意味着主視圖的任何子視圖都將保留,因爲視圖將保留設置爲子視圖的任何內容。如果您還保留了在釋放主視圖時會導致泄漏的標籤,除非您同時也釋放了標籤(但似乎沒有要點)。

但是請注意,當我說簡單地將其作爲一個子視圖到你的容器視圖「保留意見」,你已經這樣做在您發佈的代碼, - 般注意到這樣一種觀點保留子視圖。 MyView如果從子視圖中刪除,它將被釋放,所以如果你出於某種原因想要保留它,並且希望保留它,那麼你將會保留它。

筆尖加載內存管理看似複雜在第一,但規則實際上是要簡單得多比它似乎。

+0

Kendall, 我已經仔細閱讀了關於此的文檔 - 「資源編程指南」 - 並且據我所知。我應該完全清楚這個代碼。它應該正常工作。每次迭代拋出循環應該啓動新的nib文件讀取。由於我沒有做任何分配/副本,我應該很樂意去。作爲「規則」說明。 我仍然不清楚爲什麼這個簡單的代碼不能按預期工作。 – dugla 2009-10-06 14:19:46

+0

其實,我同意上面的代碼應該是工作 - 它是如何中斷的? – 2009-10-06 15:09:48

相關問題