2011-08-18 7 views
1

나는이 코드를 사용하기 위해 며칠 동안 노력해 왔지만, 내가 뭘 잘못하고 있는지 전혀 모른다. 앱이 잠자기에서 깨어날 때마다 또는 사용자가 앱을 닫고 다시 열면 (멀티 태스킹에서 앱을 닫지 않고) 라벨 값을 변경하고 싶습니다. 내 applicationDidBecomeActive에서 나는 그 시점에 열려있는 viewcontroller에 표시하고자하는 카운터를 실행하고 있습니다.applicationDidBecomeActive에 대한 도움이 필요합니다.

코드 :

- (void)applicationDidBecomeActive:(UIApplication *)application { 
counter = counter + 1; 

W1G1 *view1 = [[[W1G1 alloc] initWithNibName:@"W1G1" bundle:nil] retain]; 
[view1 setlabel]; 

} 내의 ViewController의 W1G1에서

, 나는 다음과 같은 코드가 있습니다 코드 :

- (void) setlabel { 
NSString *string = [NSString stringWithFormat:@"%d", counter]; 
vocabword.text = string; 

}

난에 W1G1을 가져온 내 appdelegate,하지만 코드가 실행되지 않습니다. (도와주세요!

감사합니다.

+0

의미를 :

- (void) setlabel:(int)counter { NSString *string = [NSString stringWithFormat:@"%d", counter]; vocabword.text = string; } 

다음 AppDelegate에 당신의

가하고 싶은거야? 오류가 있습니까? – jtbandes

+0

레이블이 변경되지 않습니다. 디버거를 통해 그것을 실행하고 코드 블록이 작동하고, 카운터와 문자열이 필요에 따라 업데이트되지만 레이블은 변경되지 않습니다. 그러나, 내 viewController에서 카운터 값을 확인할 때 업데이트 된 값을 표시합니다. 그러나이 라벨은 전혀 업데이트되지 않습니다. – Prajoth

+0

W1G1 UIViewController 하위 클래스 또는 UIView 하위 클래스 인 경우. 전자의 경우, 변수 이름 view1은 비정상적인 선택입니다. 게시 한 내용에서 명확하지 않은 점은 레이블이 뷰 계층 구조에 추가되는 방법입니다. 뷰 계층 구조에서 레이블이 전혀 업데이트되지 않습니까? – Obliquely

답변

2

1) '코드가 실행되지 않습니다'라고 말하면 어떻게됩니까? 즉, NSLog를 applicationDidBecomeActive :에 넣었을 때 setLabel에 코드가 실행되었음을 표시합니까?

2) 코드가 실행되고있는 것으로 의심됩니다. 그러나 귀하의 코드는 "그 시점에 어떤 뷰 컨트롤러가 열려 있더라도 카운터를 표시하지 않습니다". 코드에서 새보기 (view1)를 작성하지만 해당보기는 표시되지 않습니다. 그것은 서브 뷰로 추가되지 않습니다. 코드도 누출됩니다. W1G1 개체를 만들지 만 결코 풀어 놓지 않으며 사용자가 가지고있는 참조를 버립니다.

원하는 것을 얻기 위해 응용 프로그램 창에 하위보기를 추가 할 수 있습니다. 앱 위임은 다음과 같은 트릭해야한다, 설정 방법을 따라 : W1G1에서 다음

counter++; 
    W1G1 *viewController1 = [[W1G1 alloc] initWithNibName:@"W1G1" bundle:nil]; 
    [viewController1 setlabel: counter]; 
    [[self window] addSubview: [viewController1 view]] 
    // you'll want to save a reference to the viewController somehow so you can release it at a later date 

있습니다
- (void) setlabel: (int) counter; 
{ 
    NSString *string = [NSString stringWithFormat:@"%d", counter]; 
    vocabword.text = string; 
} 

물론, 다른 방법의 많은 당신은이쪽으로 걸릴 수 있습니다 문제. 그리고 어떤 단계에서 추가하는 W1G1보기를 제거하기위한 전략이 필요합니다. 그렇지 않으면 점점 더 많은보기가 추가됩니다.

업데이트 : appControlroller를 추적하는 방법에 대한 의견을 묻습니다. appDelegate에서 추적하는 방법 중 하나는 appDelegate에서 추적하는 것입니다. didFinishLaunchingWithOptions : 다음의 ViewController를 만들, 그것을 참조하고 해당보기를 추가하는 속성을 설정하는 .m 파일에서

@class W1G1; 
@interface MyAppDelegate : : NSObject <UIApplicationDelegate> 

{ 
    // other decelerations 
    int counter; 
    W1G1 * _myW1G1 
} 

@property (nonatomic, retain) W1G1* theW1G1 

은 아마 응용 프로그램에서
@synthesize theW1G1 = _myW1G1; 

을 포함한다 : 헤더에 뭔가를 가지고 뷰 계층 구조.

W1G1* theViewController = [[W1G! alloc] initWithNibName: @"W1G1" bundle: nil]; 
[[self window] addSubview: [theViewController view]]; 
[self setTheW1G1: theViewController]; 
[theViewController release]; 

그런 다음 앱 대리인과 함께 viewController에 다시 액세스하려면 [self theW1G1]을 사용합니다.

[[self W1G1] setlabel: counter]; 
+0

PengOne의 답변도 참조하십시오. setLabel에 카운터를 전달하거나 (아마도 가장 좋음) W1G1이 카운터 값을 앱 대리자에게 요청할 수 있습니다. 나는 내 대답을 수정했다. – Obliquely

+0

고마워요! 그것이 작동하지 않는다고 말하면 레이블은 바뀌지 않습니다. 디버거를 통해 그것을 실행하고 코드 블록이 작동하고, 카운터와 문자열이 필요에 따라 업데이트되지만 레이블은 변경되지 않습니다. 그러나, 내 viewController에서 카운터 값을 확인할 때 업데이트 된 값을 표시합니다. 그러나이 라벨은 전혀 업데이트되지 않습니다. 당신이 언급 한 하위 뷰 메서드를 시도하고 해당 Objective-C 형식의 'addSubview :'인수 1을 전달할 때 "호환되지 않는 Objective-C 형식의 구조체 W1G1 * ','struct UIView * '가 필요하다는 경고를 던집니다. ". – Prajoth

+0

OK W1G1은 viewController입니다. 변수 이름을 선택하면보기라는 것이 좋습니다. 위의 수정 된 답변. 그러나 매번 새로운 viewController (및 뷰)를 만들고 싶다면 (또는 어떤 단계에서 정리할 때) 또는 앱의 수명 내내 viewController를 추적하고 싶다면 고려해야 할 것입니다. – Obliquely

3

AppDelegate에서.당신이

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    counter = counter + 1; 

    W1G1 *view1 = [[[W1G1 alloc] initWithNibName:@"W1G1" bundle:nil] retain]; 
    [view1 setlabel]; 
} 

변수 counter이 m 파일은 AppDelegate에 국한되어 증가된다. 즉,보기 컨트롤러가 증가했다는 것을 알지 못합니다.

counter 값을 저장하기 위해 NSUserDefaults을 사용하면 이러한보기 컨트롤러간에 쉽게 전달할 수 있습니다. 어느 쪽이든, 또는 방법 setLabel에 입력을 허용 할 수 있습니다. "실행되지 않습니다"무엇

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    counter = counter + 1; 

    W1G1 *view1 = [[[W1G1 alloc] initWithNibName:@"W1G1" bundle:nil] retain]; 
    [view1 setlabel:counter]; // <-- now you're using counter 

    [self.window addSubview:view1]; 
} 
관련 문제