iPhone - нераспознанный селектор, «может не отвечать на addTarget» - PullRequest
0 голосов
/ 22 июля 2010

Я работаю над базовым приложением для 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 ]

3 голосов
/ 22 июля 2010

Во-первых, классы всегда начинаются с заглавных букв ....

UIScrollView является подклассом UIView, а не UIControl.

UIControl реализует addTarget:action:forControlEvents:,UIScrollView нет.Таким образом, ошибка времени выполнения.

Если вы хотите, чтобы что-то произошло в ответ на действие, выполненное в представлении прокрутки, настройте делегат для представления прокрутки.См. UIScrollViewDelegate документацию .

0 голосов
/ 22 июля 2010

попробуйте это тонкое изменение

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

и это

- (void)showMenu:(id) sender {
    NSLog(@"Show Menu");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...