2011-11-05 65 views
1

我正要爲我的iPhone項目添加UIScrollView,並且在我實現此功能之前,我想檢查我的方法是否正確,或者如果我可以違反了我不知道的一些最佳做法。UIScrollView同時被UIViewController的'視圖'屬性和插座引用

我見過的教程通常涉及將UIScrollView添加到現有的UIView,他們從那裏工作。但是,我想知道是否可以完全替代UIView,只需將UIScrollView作爲我的筆尖文件中唯一的頂級對象添加即可。

我的示例項目使用Xcode的基於視圖的應用模板:
Project navigator http://img542.imageshack.us/img542/5364/projectnavigator.png

我從原來的MySampleViewController.xib文件刪除UIView頂級對象,並通過添加UIScrollView對象代替它:
Nib placeholders http://img526.imageshack.us/img526/7709/placeholderobjects.png

現在我的筆尖文件只在畫布上顯示此對象:
Canvas http://img233.imageshack.us/img233/4063/scrollview.png

然後我創建了從0​​的view插座到UIScrollView的鏈接。現在

,如果我想以編程方式操縱的UIScrollView的內容,我可以使用此代碼:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil]; 
    // Solution B: With the following line we avoid creating an extra outlet linking to the UIScrollView top-level object in the nib file 
    UIScrollView *scrollView = (UIScrollView *)self.view; 
    for (int i = 0; i < colors.count; i++) { 
     CGRect frame; 
     //frame.origin.x = self.scroller.frame.size.width * i; // Solution A: scroller is an IBOutlet UIScrollView *scroller; 
     frame.origin.x = scrollView.frame.size.width * i;  // Solution B 
     frame.origin.y = 0; 
     //frame.size = self.scroller.frame.size;    // Solution A 
     frame.size = scrollView.frame.size;      // Solution B 

     UIView *subView = [[UIView alloc] initWithFrame:frame]; 
     subView.backgroundColor = [colors objectAtIndex:i]; 
     //[self.scroller addSubview:subView];     // Solution A 
     [self.view addSubview:subView];       // Solution B 

     [subView release]; 
    } 
    //self.scroller.contentSize = CGSizeMake(self.scroller.frame.size.width * colors.count, self.scroller.frame.size.height); // Solution A 
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * colors.count, scrollView.frame.size.height); // Solution B 
} 

爲了實現解決方案A滾輪出口必須連接到筆尖的UIScrollView的爲好,在連接檢查看起來像這樣:
Connections Inspector http://img228.imageshack.us/img228/8397/connectionsj.png


溶液A需要一個出口,這意味着公頃ving兩個連接UIScrollViewUIViewController自己的view outlet和MySampleViewControllerscroller outlet。是否合法和/或建議有兩個網點指向同一視圖?

溶液B只涉及UIViewControllerview插座連接到視圖,並使用該行:

UIScrollView *scrollView = (UIScrollView *)self.view; 

我的問題:

  1. 我是否招致某種違反了Apple使用這兩種解決方案之一的設計指南?
  2. 我應該堅持UIView解決方案中的UIScrollView嗎?
  3. 有沒有其他的方法來實現這個?

謝謝!

P.S.對不起,語法突出顯示,SO沒有認識到使用'objective-c'標籤

+0

有什麼問題在視圖內部有滾動視圖。我認爲uiview的成本可以忽略不計 – ethyreal

回答

4
  1. 不,我認爲你是好的任何一種方式。

  2. 我會,我不認爲一個UIView有任何顯着的成本,再加上如果你想添加一個頁面控制?並且您不必在每次需要時都將控制器的視圖轉換爲UIScrollView。

  3. 看起來像你控制着我。

溶液A需要一個出口,這意味着具有兩個連接到的UIScrollView:所述UIViewController的自己的觀點出口和MySampleViewController的滾輪出口。是否合法和/或建議有兩個網點指向同一視圖?

標準的做法是讓IBOutlets在您的.nib中定義的任何視圖中直接從視圖控制器訪問。

如果你不想兩個出口,你可以給滾動視圖,然後標記找到它,像這樣:

UIScrollView *myScrollView = (UIScrollView *)[self.view viewWithTag:1] 

那麼你就只能有觀點作爲出口,但我只想補充額外的出口。只要確保在viewDidUnload中將它們設置爲零即可。

此外,您不必保留滾動視圖(如果您甚至仍在使用保留/釋放)。由於滾動視圖位於視圖控制器的視圖中,因此它保留了引用,因此如果使用ARC,則可以通過賦值或星期來獲得滾動視圖的屬性。

希望有所幫助。

+0

非常感謝您的快速回復,我只想在進一步處理之前進行現實檢查。如果我需要在未來添加其他視圖,那麼使用'UIView'就是對的。投票答覆! – rtovars

相關問題