2010-07-22 6 views
0

일부 iPhone을 테스트하기 위해 기본 iPhone 응용 프로그램에서 작업하고 있으며 이해할 수 없거나 대답을 찾을 수 없다는 오류가 발생합니다. 나는 IB를 전혀 사용하지 않고있다. (생성하는 MainWindow.xib는 제외하고).iPhone - 인식 할 수없는 선택기, "addTarget에 응답하지 않을 수 있습니다."

지금 당장 가능한 한 기본입니다.

mainAppDelegate.h

#import <UIKit/UIKit.h> 
#import "mainViewController.h" 

@interface mainAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    mainViewController *viewController; 
} 

@property (nonatomic, retain) IBOutlet UIWindow *window; 
@property (nonatomic, retain) mainViewController *viewController; 

@end 

mainAppDelegate.m

#import "mainAppDelegate.h" 

@implementation mainAppDelegate 

@synthesize window; 
@synthesize viewController; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    self.viewController = [[mainViewController alloc] init]; 
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

    return YES; 
} 

- (void)dealloc { 
    [viewController release]; 
    [window release]; 
    [super dealloc]; 
} 

@end 

mainViewController.h

#import <UIKit/UIKit.h> 

@interface mainViewController : UIViewController { 

} 

- (void)showMenu; 

@end 

mainViewController.m

#import "mainViewController.h" 

@implementation mainViewController 

- (void)loadView { 
    UIScrollView *mainView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
    mainView.scrollEnabled = YES; 
    self.view = mainView;  
    self.view.backgroundColor = [UIColor grayColor]; 

    [self.view setUserInteractionEnabled:YES]; 
    [self.view addTarget:self action:@selector(showMenu) forControlEvents:UIControlEventTouchDown]; 

    [mainView release]; 
} 

- (void)showMenu { 
    NSLog(@"Show Menu"); 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

@end 
,

지금, 나는이 줄에 경고를 얻을 : 조치 : : forControlEvents :

[self.view addTarget:self action:@selector(showMenu) forControlEvents:UIControlEventTouchDown]; 

-addTarget '으로 UIView가 응답하지 않을 수 있습니다'말한다 '. 그리고 UIView 하위 클래스가 확실히 addTarget에 응답 할 수 있기 때문에 의미가 없습니다. loadView가 끝날 때까지 release하지 않기 때문에 존재해야하는 self.view에서 호출하고 있습니다.

추적을 보면 실제 에러 것을 보여준다 (심지어 후 상기 제어기에 의해 유지해야한다) - [있는 UIScrollView addTarget을 : 동작 : forControlEvents는 :] : 미정 선택기 0x5f11490

그래서 그것을 인스턴스에 보내 선택기 자체에 문제가있는 것 같지만 선택기에는 아무런 문제가 없습니다.

나는 이것에 상당히 좌절감을 느낀다. 그리고 어떤 도움이 좋을 것이다.

답변

3

첫 번째 시도.

UIControladdTarget:action:forControlEvents:을 구현합니다. UIScrollView 않습니다. 따라서 런타임 오류입니다.

스크롤보기에서 수행 한 동작에 응답하여 무언가를 만들고 싶다면 스크롤보기의 대리자를 설정하십시오. UIScrollViewDelegate's documentation을 참조하십시오.

+0

+1에 대한 'UIControl'. 더 깊은 통찰력으로, 'UIControl'은 터치 다운이나 터치 업과 같은 모든 'UIControlEvents'를 제공합니다. 객체가'UIControl'의 서브 클래스가 아니면, 그 객체를 사용할 수 없습니다. 빠른 예제는 뷰가있는 XIB를 여는 것입니다. 보기를 클릭하고 검사기 창으로 이동하면 해당 제어 이벤트가 없음을 알 수 있습니다.이제 검사기 창의 마지막 탭으로 이동하여 UIView 대신 'UIControl' 하위 클래스로 만들면 마술처럼 모든 이벤트를 가질 수 있습니다. – iwasrobbed

+0

고마워요. 정확히 제가 알아야 할 것이 었습니다. 나는 그것을 확인 했어야했다. '수업은 항상 대문자로 시작합니다.'- 그 규칙은 필요한가요? –

+1

Objective-C 협약, 많은 사람들이 혼란을 야기하는 광기를 피할 필요가 있다고 생각합니다. :) – bbum

0

UIScrollView

UIView의 서브 클래스가 아닌 UIControl입니다 .... 클래스는 항상 대문자로 시작,이 미묘한 변화

[self.view addTarget:self action:@selector(showMenu:) 
           forControlEvents:UIControlEventTouchDown]; 

- (void)showMenu:(id) sender { 
    NSLog(@"Show Menu"); 
} 
+0

감사합니다. 아론, 내 문제를 해결했습니다. 나는 공식 페이스 북 SDK 문서를 따르고 콜론이 누락되었습니다. – andyc

관련 문제