2012-06-17 2 views
0

을 작동하지 않는, 뷰에 추가 이 activityindicator 코드는 웹을 통해 데이터를로드하는 다른 컨트롤의 여러 activityIndicatorViews에 대한 코드이므로 재사용 가능한 코드를 만들기위한 구현이었으며 위의 코드와 같은 activityIndicator 뷰를 표시하지 않습니다. 예 나는이 코드를 사용하는 각 컨트롤에 대해이 코드를 실행하고 [activityIndicator startAnimating]을 호출한다. 이 함수에 전달한 activityIndicator에 대한 설명입니다. 내가 물어 보는 부분은 코드의 다른 부분을 어디에서 봐야할까요?여기 내가 사용하고 코드의 원래 부분은, 난이 아이폰 OS 조리법 PragProg 책에서 조리법을 사용하고

- (void)addActivityIndicatorView:(UIActivityIndicatorView *)acitivityIndicator toView:(UIView *)view { 

    acitivityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    acitivityIndicator.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | 
    UIViewAutoresizingFlexibleRightMargin | 
    UIViewAutoresizingFlexibleBottomMargin | 
    UIViewAutoresizingFlexibleLeftMargin;      
    CGRect aiFrame = acitivityIndicator.frame; 
    CGFloat originX = (view.bounds.size.width - aiFrame.size.width)/2; 
    CGFloat originY = (view.bounds.size.height - aiFrame.size.height)/2; 
    aiFrame.origin.x = floorl(originX); 
    aiFrame.origin.y = floorl(originY); 
    acitivityIndicator.frame = aiFrame; 
    [view addSubview:acitivityIndicator]; 
} 
+0

은 메인 스레드 시간이 너무 짧아서 시작 애니메이션과 정지 애니메이션이 작동하지 않습니다. 작동 표시가 나타나지 않습니다. u 스레드가 애니메이션으로 시작하고 애니메이션이 시작될 때 새 스레드로 분리하여 확인할 수 있습니다. 원할 경우 –

답변

2

은 다음과 같이 당신의 방법을 쓰기 :

- (void)addActivityIndicatorView:(UIActivityIndicatorView **)activityIndicator toView:(UIView *)view { 

    UIActivityIndicatorView * activeInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    activeInd.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | 
    UIViewAutoresizingFlexibleRightMargin | 
    UIViewAutoresizingFlexibleBottomMargin | 
    UIViewAutoresizingFlexibleLeftMargin;      
    CGRect aiFrame = activeInd.frame; 
    CGFloat originX = (view.bounds.size.width - aiFrame.size.width)/2; 
    CGFloat originY = (view.bounds.size.height - aiFrame.size.height)/2; 
    aiFrame.origin.x = floorl(originX); 
    aiFrame.origin.y = floorl(originY); 
    activeInd.frame = aiFrame; 

    *activityIndicator = activeInd; 
    [view addSubview:*activityIndicator]; 
} 

을하면, 위의 방법을 사용하는 예를 들어 방법에 UIActivityIndicatorView *에 대한 참조를 전달하려는 경우 : 지금 때마다

-(void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIActivityIndicatorView * ai; 
    [self addActivityIndicatorView: &ai toView: self.view]; 

    activityIndicator = ai; 
} 

애니메이션이 시작되기를 원합니다 :

[activityIndicator startAnimating]; 
+0

아시다시피 방법은 수정되지 않습니다. 전달 된 실제 인수 대신 인수의 사본을 만들고 사본의 메소드 내부에서 어떤 연산을 수행합니다. 실제 인수를 수정하려면 인수로 포인터를 전달하여 참조로 전달합니다. 귀하의 경우에는 포인터를 수정하고자하므로 포인터에 대한 참조 (포인터에 대한 포인터)를 전달해야합니다 –

+0

감사의 제우스. C#에서는 메서드에 전달 된 개체를 새로 만들거나 다른 개체를 가리 키도록 할 수없고 내용 만 수정하거나 메서드를 호출하는 등 C#에서는이 사실을 알고있었습니다. Obj-C와 동일합니다. –

관련 문제