iPhone — Неопознанный селектор, может не отвечать на addTarget

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

Так что похоже, что это проблема с самим селектором, но я не вижу ничего плохого в моем селекторе!

Я довольно сбит с толку этим, и любая помощь была бы здоровой.


person Evan Cordell    schedule 22.07.2010    source источник


Ответы (2)


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

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

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

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

person bbum    schedule 22.07.2010
comment
+1 за UIControl. В качестве дальнейшего понимания, UIControl — это то, что дает вам все эти UIControlEvents, такие как касание или подкрашивание. Если объект не является подклассом UIControl, вы не можете использовать для него эти события. Быстрым примером может быть открытие XIB, в котором есть представление. Щелкните представление, перейдите в окно инспектора, и вы увидите, что в нем нет ни одного из этих управляющих событий. Теперь, если вы перейдете на последнюю вкладку окна инспектора и сделаете его подклассом UIControl вместо UIView, у него волшебным образом будут все те события, которые вы можете подключить. - person iwasrobbed; 22.07.2010
comment
Спасибо, это именно то, что мне нужно было знать. Я должен был знать, чтобы проверить это. Когда вы говорите, что «классы всегда начинаются с заглавных букв» — это условность или необходимость? - person Evan Cordell; 22.07.2010
comment
Конвенция Objective-C, хотя многие из нас считают необходимым избегать безумия, вызывающего путаницу. :) - person bbum; 22.07.2010

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

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

и это

- (void)showMenu:(id) sender {
    NSLog(@"Show Menu");
}
person Aaron Saunders    schedule 22.07.2010
comment
Спасибо, Аарон, решил мою проблему. Я следил за официальной документацией SDK facebook, и двоеточие отсутствовало. - person andyc; 30.12.2011