2012-08-14 3 views
1

내 용어가 정확하지 않은 경우 사과드립니다 .- 며칠 동안 Objective C를 배우므로 조금 익숙하지 않습니다.다른 클래스 인스턴스의 한 클래스에서 UIProgressView를 업데이트하십시오.

Xcode의 스토리 보드 "빠른 드래그"기능을 사용하여 IBOutlet으로 진행률 표시 줄 (UIProgressView)이 연결되어 입니다. ViewController는 내가 작성한 사용자 정의 클래스의 객체를 인스턴스화합니다. 그것은 약 15-20 초가 걸리는 긴 작업을 수행하는 객체의 선택 자에게 메시지를 전달합니다. 작업이 진행됨에 따라 진행률 막대를 업데이트 할 수 있기를 원하지만 호출하는 클래스의 UIProgressView에 액세스하는 방법을 알아낼 수 없습니다. 객체의 메서드가 루프의 한계를 알고있는 긴 루프를 실행하고 루프의 현재 위치를 기반으로 진행 막대를 업데이트 할 수 있으므로 타이머를 사용할 필요가 없습니다.

객관적인 C 프로그래밍에서는 꽤 기본적인 개념이지만 올바른 방향이나 문서를 향한 자극은 정말 나를 도울 것입니다.

+0

objC 문제가 아니므로 앱 아키텍처에 문제가 있습니다. OOP에 관한 책을 읽으십시오. – tikhop

+0

이것이 왜 잘못된 방법인가, 더 좋은 방법이 될지에 대한 제안이 있습니까? 그것은 제가 "책 읽기"라고 말하는 것 이상을 이해하는 데 도움이 될 것입니다. – Nande

+0

ViewController는 UIProgressView를 업데이트해야합니다. 일부 컨트롤러/관리자는 오랜 시간 작업하고 모델을 업데이트합니다. Model dispatch가 ViewController로 변경된 다음 ViewController가 UIProgressView를 업데이트합니다. – tikhop

답변

1

대리자 패턴을 사용하십시오.

는 ProgressBar의 업데이트 프로토콜을 만듭니다

@protocol MyProgressBarDelegate 

- (void) onUpdateProgress:(NSInteger)progress; 

@end 

귀하의 ViewController 대리자를 구현하고이 onUpdateProgress 방법이 포함되어 있습니다.

사용자 정의 클래스에는 이니셜 라이저에서 설정 한 대리자 변수가 있으며 해당 세트는 ViewController 인스턴스로 설정됩니다.

id <MyProgressBarDelegate> delegate; 

사용자 지정 클래스 지정 초기화 프로그램을 업데이트하여 대리자 : (id) 대리자를 매개 변수로 전달하십시오.

- (void) initWithDelegate:(id<MyProgressBarDelegate>)delegate 
{ 
    self.delegate = delegate; 
} 

당신에서는 CustomClass, [[에서는 CustomClass ALLOC] initWithDelegate : 자기] 초기화;

또는 대리인을 @property로 설정하고 [mCustomClass setDelegate : self]를 통해 업데이트하십시오.

그런 다음 사용자 정의 클래스에서 onUpdateProgress 메소드를 호출 할 수 있습니다.

if (delegate != nil)  
[delegate onUpdateProgress:int]; 
+0

정말 명확한 설명입니다. 추가 작업을 복잡하게하려면 다음과 같이하면됩니다 : dispatch_async (dispatch_get_global_queue ....),^{루프를 만드는 다른 객체의 메소드를 만들고 호출하는 블록}}?이 일을 시도하고 그 실행 시간 주어진 대기열에 넣어,하지만 난 델리게이트 메서드를 호출 할 것 결코 보였다. – Nande

+0

스레딩/GCD에 대해 걱정하기 전에 대리인을 올바르게 연결하십시오. 빈 onUpdateProgress 메서드를 만들고 대리자를 설정하고 사용자 지정 클래스에서 [delegate onUpdateProgress : 0]을 호출합니다. 디버거에서 추적. 일단 연결되면 GCD를 통해 필요한 모든 작업을 수행 할 수 있습니다 (UI 스레드에서 수행해야하는 ProgressBar 업데이트 제외). 위임은 ​​포인터 일뿐입니다. – CSmith

+0

확인. 나는 그것을 전혀 문제 삼지 않는 것 같다. 이 프로토콜을 호출하는 viewcontroller.h 파일, viewcontroller.m 파일의 메소드 정의 및 위임 변수에 사용자 정의 클래스의 인스턴스 변수와 함께 넣습니다. 빌드 오류나 경고는 없지만 코드를 실행하고 [delegate methodName]을 수행하면 아무 일도 일어나지 않습니다. 로그를 확인하고 대리자가 NIL이므로 어떻게 든 작동하지 않습니다. 모든 것을 올바른 장소에두고 있습니까? – Nande

0

사용자 지정 클래스의 대리자로보기 컨트롤러를 할당하고 사용자 지정 클래스가 해당 진행을 viewcontroller에보고하도록 할 수 있습니다. 먼저 사용자 지정 클래스의 대리자에 대한 프로토콜을 정의한 다음 해당 프로토콜을 준수하도록 View Controller를 만들고 사용자 지정 클래스의 인스턴스를 만든 후에는 대리자를 할당합니다.

관련 문제