2010-07-22 2 views
0

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

Теперь я получаю предупреждение на этой линии:

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

, что говорит: «UIView может не реагировать на '-addTarget: действие: forControlEvents:'. И это не имеет смысла, потому что подкласс UIView, безусловно, может ответить на addTarget, и я вызываю его на self.view, который должен существовать, потому что я не выпускаю его до конца loadView. (И даже тогда она должна быть сохранена контроллером)

Глядя на след показывает, что фактическая ошибка - [UIScrollView addTarget: действие: forControlEvents]: непризнанные селектор направлен например 0x5f11490

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

Я довольно озадачен этим, и любая помощь будет замечательной.

ответ

3

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

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

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

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

+0

+1 для 'UIControl'. Как дальнейшее понимание, 'UIControl' - это то, что дает вам все эти« UIControlEvents », такие как прикосновение или касание. Если объект не является подклассом 'UIControl', то вы не можете использовать эти события на нем. Быстрый пример - открыть XIB, в котором есть представление. Нажмите вид, войдите в окно инспектора, и вы увидите, что у него нет ни одного из этих контрольных событий.Теперь, если вы переходите к последней вкладке окна инспектора и делаете ее подклассом UIControl, а не 'UIView', у этого волшебного есть все те события, которые вы можете подключить. – iwasrobbed

+0

Спасибо, это именно то, что мне нужно было знать. Я должен был это проверить. Когда вы говорите, что «классы всегда начинаются с заглавных букв» - это соглашение или необходимо? –

+1

Конвенция Цель-C, хотя многие из нас считают необходимым избегать безумия, вызывающего путаницу. :) – bbum

0

попробовать это тонкое изменение

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

и это

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

Спасибо Аарон, решил мою проблему. Я следил за официальной документацией по SDK в facebook и отсутствовал двоеточие. – andyc

Смежные вопросы