2013-04-23 61 views
0

好了,我有一個自定義UIView類叫做NumberTicker,創建幾個UIScrollViewsUILabels使得滾動NumberTicker由填充它們。但是,我無法正確訪問scrollviews的屬性,例如。自定義UIView子類具有的UIScrollView,self.scrollview是(空)

[self.scrollview setHidden:YES]; 
// or 
[self.scrollview setContentOffset:offset]; 

以上,而實際上任何試圖設置或獲取UIScrollView的屬性不工作,在創建scrollview時除外,然後將其添加爲subview

這裏是我的NumberTicker.h文件:

// NumberTicker.h 
#import <Foundation/Foundation.h> 
#import "ProfileViewController.h" 

@interface NumberTicker : UIScrollView <UIScrollViewDelegate> 

@property (weak, nonatomic) IBOutlet UIScrollView *digitOne; 
@property (weak, nonatomic) IBOutlet UIScrollView *digitTwo; 
@property (weak, nonatomic) IBOutlet UIScrollView *digitThree; 
@property (weak, nonatomic) IBOutlet UIScrollView *digitFour; 
@property (weak, nonatomic) IBOutlet UIScrollView *digitFive; 
@property (weak, nonatomic) IBOutlet UIScrollView *digitSix; 
@property (weak, nonatomic) IBOutlet UIScrollView *digitSeven; 
@property (weak, nonatomic) IBOutlet UIScrollView *digitEight; 


- (id) initWithDigits:(int)digits andFrame:(CGRect)frame; 
- (void) setNumberTickerTo:(int)number; 

@end 

和NumberTicker.m:

// NumberTicker.m 

#import "NumberTicker.h" 

@implementation NumberTicker 

- (id) initWithDigits:(int)digits andFrame:(CGRect)frame 
{ 
    self = [super init]; 
    if (self) { 
     // add digits 
     [self setDigitEight:_digitEight]; 
     [self setDigitOne:_digitOne]; 
     if (digits > 6) { 
      // make 8 digit ticker 
      [self setFrame:frame]; 
      for (int i = 1; i <= digits; i++) { 
       switch (i) { 
        case 1: 
         [self addSmallScrollView:_digitOne withXPos:(frame.size.width - (i*30))]; 
         break; 
        case 2: 
         [self addSmallScrollView:_digitTwo withXPos:(frame.size.width - (i*30))]; 
         break; 
        case 3: 
         [self addSmallScrollView:_digitThree withXPos:(frame.size.width - (i*30))]; 
         break; 
        case 4: 
         [self addSmallScrollView:_digitFour withXPos:(frame.size.width - (i*30))]; 
         break; 
        case 5: 
         [self addSmallScrollView:_digitFive withXPos:(frame.size.width - (i*30))]; 
         break; 
        case 6: 
         [self addSmallScrollView:_digitSix withXPos:(frame.size.width - (i*30))]; 
         break; 
        case 7: 
         [self addSmallScrollView:_digitSeven withXPos:(frame.size.width - (i*30))]; 
         break; 
        case 8: 
         [self addSmallScrollView:_digitEight withXPos:(frame.size.width - (i*30))]; 
         break; 
        default: 
         break; 
       } 
      } 
     } else { 
      // make 6 digit ticker 
      [self setFrame:frame]; 

      for (int i = 1; i <= digits; i++) { 
       switch (i) { 
        case 1: 
         [self addScrollView:_digitOne withXPos:(frame.size.width - (i*40))]; 
         break; 
        case 2: 
         [self addScrollView:_digitTwo withXPos:(frame.size.width - (i*40))]; 
         break; 
        case 3: 
         [self addScrollView:_digitThree withXPos:(frame.size.width - (i*40))]; 
         break; 
        case 4: 
         [self addScrollView:_digitFour withXPos:(frame.size.width - (i*40))]; 
         break; 
        case 5: 
         [self addScrollView:_digitFive withXPos:(frame.size.width - (i*40))]; 
         break; 
        case 6: 
         [self addScrollView:_digitSix withXPos:(frame.size.width - (i*40))]; 
         break; 
        default: 
         break; 
       } 
      } 
     } 
    } 
    return self; 
} 

- (void) addScrollView:(UIScrollView *)scrollView withXPos:(int)xPos 
{ 
    scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(xPos, 0, 40, 60)]; 
    scrollView.contentSize = CGSizeMake(40, 660); 
    scrollView.showsHorizontalScrollIndicator = NO; 
    scrollView.showsVerticalScrollIndicator = NO; 
    scrollView.userInteractionEnabled = NO; 

// All of these properties are set properly, however I can't access them again in another method or class, after the `scrollview` has been added as a `subview` 

    for (int i = 0; i <= 10; i++) { 
     // create and add labels to scrollview 
     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, i*60, 40, 60)]; 
     [label setFont:[UIFont fontWithName:@"Helvetica-Bold" size:70]]; 
     [label setTextAlignment:NSTextAlignmentCenter]; 
     if (i == 10) { 
      [label setText:@"0"]; 
     } else { 
      [label setText:[NSString stringWithFormat:@"%i", i]]; 
     } 
     [scrollView addSubview:label]; 
    } 
    [self addSubview:scrollView]; 
} 

- (void) addSmallScrollView:(UIScrollView *)scrollView withXPos:(int)xPos 
{ 
    scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(xPos, 0, 30, 50)]; 
    scrollView.contentSize = CGSizeMake(30, 550); 
    scrollView.showsHorizontalScrollIndicator = NO; 
    scrollView.showsVerticalScrollIndicator = NO; 
    scrollView.userInteractionEnabled = NO; 
    scrollView.delegate = self; 

    for (int i = 0; i <= 10; i++) { 
     // create and add labels to scrollview 
     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, i*50, 30, 50)]; 
     [label setFont:[UIFont fontWithName:@"Helvetica-Bold" size:50]]; 
     [label setTextAlignment:NSTextAlignmentCenter]; 
     if (i == 10) { 
      [label setText:@"0"]; 
     } else { 
      [label setText:[NSString stringWithFormat:@"%i", i]]; 
     } 
     [scrollView addSubview:label]; 
    } 
    [self addSubview:scrollView]; 
} 

- (void) setNumberTickerTo:(int)number 
{ 
    NSMutableArray *digitsArray = [[NSMutableArray alloc] init]; 
    while (number > 0) { 
     [digitsArray addObject:[NSNumber numberWithInt:(number % 10)]]; 
     number = number/10; 
    } 
    for (int i = 1; i <= [digitsArray count]; i++) { 
     switch (i) { 
      case 1: 
       [self.digitOne setContentOffset:CGPointMake(0, [[digitsArray objectAtIndex:0] integerValue] * 60) animated:YES]; // this doesn't work 
       NSLog(@"%@", self.digitOne); 
       [digitsArray removeObjectAtIndex:0]; 
       break; 
      case 2: 
       [_digitTwo setContentOffset:CGPointMake(0, [[digitsArray objectAtIndex:0] integerValue] * 60) animated:YES]; 
       [digitsArray removeObjectAtIndex:0]; 
       break; 
      case 3: 
       [_digitThree setContentOffset:CGPointMake(0, [[digitsArray objectAtIndex:0] integerValue] * 60) animated:YES]; 
       [digitsArray removeObjectAtIndex:0]; 
       break; 
      case 4: 
       [_digitFour setContentOffset:CGPointMake(0, [[digitsArray objectAtIndex:0] integerValue] * 60) animated:YES]; 
       [digitsArray removeObjectAtIndex:0]; 
       break; 
      case 5: 
       [_digitFive setContentOffset:CGPointMake(0, [[digitsArray objectAtIndex:0] integerValue] * 60) animated:YES]; 
       [digitsArray removeObjectAtIndex:0]; 
       break; 
      case 6: 
       [_digitSix setContentOffset:CGPointMake(0, [[digitsArray objectAtIndex:0] integerValue] * 60) animated:YES]; 
       [digitsArray removeObjectAtIndex:0]; 
       break; 
      case 7: 
       [_digitSeven setContentOffset:CGPointMake(0, [[digitsArray objectAtIndex:0] integerValue] * 60) animated:YES]; 
       [digitsArray removeObjectAtIndex:0]; 
       break; 
      case 8: 
       [_digitEight setContentOffset:CGPointMake(0, [[digitsArray objectAtIndex:0] integerValue] * 60) animated:YES]; 
       [digitsArray removeObjectAtIndex:0]; 
       break; 
      default: 
       break; 
     } 
    } 
} 

@end 

我然後調用NumberTicker從我ViewController.mviewDidLoad方法:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NumberTicker *numberTicker = [[NumberTicker alloc] initWithDigits:3 andFrame:CGRectMake(20, 20, 240, 60)]; 
    [self.view addSubview:numberTicker]; 
    [numberTicker setNumberTickerTo:345]; 
} 

NumberTicker視圖顯示屏幕上,如scrollviews,一切似乎都很好。但是,我不能隱藏scrollviews,請使用setContentOffset來滾動它們,爲它們或任何其他設置動畫。

我試過綜合屬性,設置委託,使用IB來製作一個視圖,然後適當地連接出口(我已經刪除了這個,因爲我對這個特殊的類不感興趣,而且它沒有在任何情況下工作。

如果我嘗試

NSLog(@"%@", self.digitOne); 

控制檯顯示self.digitOne爲(空)。

什麼我做錯了嗎?如何正確子類UIView和編程創建012其中的,其後的屬性可以在其他方法中編輯?

回答

0

您的addSmallScrollView方法只是將其參數變量重新分配給新的滾動視圖,但它對作爲其第一個參數傳遞的對象沒有任何作用。例如,您實際上從未分配任何東西給_digitOne

我建議你改變addSmallScrollView喜歡的東西createNewSmallScrollView和它的工作或多或少現在怎麼做,但是在方法內部實例化的滾動視圖。然後你可以使用它:

_digitOne = [self createNewSmallScrollViewWithXPos:(frame.size.width - (i*30))] 
+0

當然。這完全正確。謝謝Aaron。 – stefmalawi 2013-04-23 01:52:58

0

你綜合了你的滾動視圖,我想你只能使用'自我'。符號如果屬性是合成的。