iPhone - 无法识别的选择器,“可能无法响应addTarget”

时间:2010-07-22 15:49:01

标签: iphone uiscrollview uicontrol unrecognized-selector

我正在研究一个基本的iPhone应用程序来测试一些事件,我遇到了一个我无法理解的错误或者找不到任何答案。我根本不使用IB(除了它创建的MainWindow.xib)。

现在它已经尽可能基本了。

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

现在,我在这一行收到警告:

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

表示'UIView可能无法响应'-addTarget:action:forControlEvents:'。这没有意义,因为UIView子类当然可以响应addTarget,我在self.view上调用它,它必须存在,因为我直到loadView结束才释放它。 (甚至它应该由控制器保留)

查看跟踪显示实际错误是 - [UIScrollView addTarget:action:forControlEvents:]:无法识别的选择器发送到实例0x5f11490

所以它看起来像选择器本身的问题,但我看到我的选择器没有错!

我对此感到非常困惑,任何帮助都会很棒。

2 个答案:

答案 0 :(得分:3)

首先,课程总是以大写字母开头......

UIScrollViewUIView的子类,而不是UIControl

UIControl实施addTarget:action:forControlEvents:UIScrollView没有。因此,运行时错误。

如果您想要响应在滚动视图上执行的操作而发生某些事情,请为滚动视图设置委托。请参阅UIScrollViewDelegate's documentation

答案 1 :(得分:0)

尝试这种微妙的改变

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

和这个

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