2013-04-23 5 views
0

좋아, 그래서 나는 몇 UIScrollViews를 만들고 UILabels 스크롤 NumberTicker이 이루어 지도록로 채 웁니다 NumberTicker라는 사용자 지정 UIView 클래스를 가지고있다. 그러나 나는 scrollviews의 속성에 제대로 액세스 할 수 없습니다.사용자 정의 UIView의 서브 클래스는, self.scrollview는 (널)

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

설정하거나이 subview로 추가되기 전에 scrollview가 생성 될 때를 제외하고, 작동하지 않습니다 UIScrollView의 속성을 얻을 수있는 위의 사실에서 시도.

// 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 

그때 내 ViewController.mviewDidLoad 방법에서 NumberTicker를 호출

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

NumberTicker보기 여기

NumberTicker.h 파일입니다 에 나타납니다. 화면은 scrollviews처럼 모든 것이 잘 보입니다. 그러나 scrollviews을 숨길 수는 없으며 setContentOffset을 사용하여 스크롤하거나 애니메이션을 적용 할 수 있습니다.

대표를 설정하고, IB를 사용하여 뷰를 만든 다음 적절하게 콘센트에 연결하려고했습니다. (이후이 특정 클래스의 IB에는 관심이 없으므로 삭제했습니다. 어떤 경우에 작동합니다.

을 내가 콘솔 (NULL)로 self.digitOne을 보여줍니다

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

을 시도하십시오. 내가 잘못 뭐하는 거지

을? 어떻게 제대로 UIView를 서브 클래스 않고 프로그래밍 012을 만들 그 안에의 속성이 있으며 나중에 다른 방법으로 편집 할 수 있습니까?

답변

0

addSmallScrollView 메서드는 변수 을 새로운 스크롤 뷰에 재 할당하지만 첫 번째 인수로 전달 된 객체에는 아무런 영향을주지 않습니다. 실제로 예를 들어 _digitOne에 아무 것도 지정하지 않았습니다.

나는 당신이 메서드 내 인스턴스화 스크롤 뷰를 createNewSmallScrollView 같은 것으로 addSmallScrollView을 변경하고 더 많거나 지금 어떻게하는지 일을 적게 가지고 있지만, 반환하는 것이 좋습니다. 그렇다면 다음과 같이 사용할 수 있습니다 :

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

물론. 이것은 정확하게 맞았습니다. 아론 감사합니다. – stefmalawi

0

스크롤 뷰를 합성 했습니까? '자기'만 사용할 수 있다고 생각합니다. 속성이 합성되면 표기법.

관련 문제