2010-08-20 6 views
1

아래 코드에서 willPresentAlertView 메소드가 호출되지 않았습니다. 왜? 이 방법은 정적입니까? 또는 Alert 값이 정적입니까?정적 UIAlertView가 호출되지 않았습니다. willPresentAlertView

@interface ShowAlert : NSObject <UIAlertViewDelegate> 

static UIAlertView* alert; 

    +(void) showAlert:(NSString*) msg{  
     alert = [[UIAlertView alloc] initWithTitle:nil message:[NSString stringWithFormat:@"%@", msg] delegate:self cancelButtonTitle:nil otherButtonTitles:nil]; 
     [alert show]; 
    } 

    - (void)willPresentAlertView:(UIAlertView *)alertView { 
     NSLOG(@"willPresentAlertView"); 
    } 
+1

실제 코드를 정확하게 게시 했습니까? 그리고 NSLOG는 무엇입니까? 표준 NSLog는 약간 다른 철자법을 가지고 있습니다 ... – Vladimir

+0

#define NSLOG (...) NSLog (__ VA_ARGS__) 그것은 NSLOG입니다. – mooongcle

답변

2

는 목표 - C의 정적 방법 같은 건 없다, 그리고 변수의 저장 클래스는 UIKit이 무엇을 함께 할 수 없다.

다음은 무슨 짓을했는지 :

  1. 당신은 클래스 메소드를 구현하고 거기에 경고를 만들었습니다.
  2. 이 방법에서는 경고의 위임을 self으로 설정합니다. 클래스 메서드이므로 self이 클래스이므로 경고의 대리자를 ShowAlert 클래스로 설정해야합니다.
  3. 경고를 보였습니다. 경고의 대리자 (ShowAlert 클래스)는 willPresentAlertView:에 응답하지 않으므로 경고는 해당 메시지를 보내려고 시도하지 않습니다.

"뭐라구?" "willPresentAlertView:을 구현했습니다."

글쎄, 네, 인스턴스으로 구현했습니다. 따라서 ShowAlert의 인스턴스는 해당 메시지에 응답합니다. 그러나 경고의 위임은 ShowAlert의 인스턴스가 아닙니다. 클래스 메소드가 아닌 인스턴스 메소드로 구현 되었기 때문에 ShowAlert 클래스 자체는 해당 메시지에 응답하지 않습니다.

왜 처음에이 클래스를 만들 었는지 이해가 안됩니다. 경고를 표시하고자하는 것은 무엇이든해야하며, 경고의 대표자가되고 경고 자체를 표시해야합니까? 왜 다른 클래스를 사이에 두어야합니까? (클래스는 일반적으로 동사가 아닌 명사에 대해 이름을 지정해야하며,이 클래스의 이름은 "ShowAlert"이므로 여기에서 잘못된 것이 있습니다.)

이 클래스를 사용하는 것이 좋습니다. 당신은 각 인스턴스를 만들고, 위임자로 만들고, UIAlertView를 보여 주어야한다. (따라서 구현 파일에 정적 변수가 아닌 인스턴스 변수 인 alert을 만들거나) 구현을 변경하여 클래스가 willPresentAlertView:에 응답하도록해야한다. 인스턴스 메서드에서 클래스 메서드로 변환합니다.

관련 문제