我的自定义键盘和播放“喀哒”声时有些麻烦。我正在使用以下类和定义。

KeyboardShotInputView.h

#import <UIKit/UIKit.h>

//------------------------------------------------------------------------------
// Protocol defintion
//------------------------------------------------------------------------------

@protocol KeyboardShotInputDelegate

- (void)shotButtonDidTouchDown:(NSString*)value;
- (void)deleteButtonDidTouchDown;

@end

//------------------------------------------------------------------------------
// Interface defintition
//------------------------------------------------------------------------------

@interface KeyboardShotInputView : UIView <UIInputViewAudioFeedback>

@property (nonatomic, strong) id <KeyboardShotInputDelegate> delegate;
@property (strong, nonatomic) IBOutlet UIView *keyboard;
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *shotButtonCollection;
@property (weak, nonatomic) IBOutlet UIButton *deleteButton;

- (UIView *) getKeyboardView;
- (IBAction)shotButtonPressed:(id)sender;
- (IBAction)deleteButtonPressed:(id)sender;
@end

KeyboardShotInputView.m
#import "KeyboardShotInputView.h"

@implementation KeyboardShotInputView

@synthesize keyboard;
@synthesize shotButtonCollection;
@synthesize deleteButton;

//------------------------------------------------------------------------------

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if (self) {
        [self loadInputView];
    }
    return self;
}

//------------------------------------------------------------------------------

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];

    if (self) {
        [self loadInputView];
    }
    return self;
}

//------------------------------------------------------------------------------

- (void)loadInputView
{
    // load nib file
    UINib *inputViewNib = [UINib nibWithNibName:@"KeyboardShotInput" bundle:nil];
    [inputViewNib instantiateWithOwner:self options:nil];

    // layout shot input buttons
    for (UIButton *btn in shotButtonCollection) {
        //[btn.layer setBorderWidth:1.0];
        [btn.layer setCornerRadius:5.0];
        [btn.layer setShadowColor:[UIColor blackColor].CGColor];
        [btn.layer setShadowOpacity:0.9];
        [btn.layer setShadowRadius:1.0];
        [btn.layer setShadowOffset:CGSizeMake(0.0, 1.0)];
    }

    // layout delete button
    [self.deleteButton.layer setBorderWidth:1.0];
    [self.deleteButton.layer setCornerRadius:5.0];
    [self.deleteButton.layer setCornerRadius:5.0];
    [self.deleteButton.layer setShadowColor:[UIColor blackColor].CGColor];
    [self.deleteButton.layer setShadowOpacity:0.9];
    [self.deleteButton.layer setShadowRadius:1.0];
    [self.deleteButton.layer setShadowOffset:CGSizeMake(0.0, 1.0)];
}

//------------------------------------------------------------------------------

/**
 * Enable input clicks.
 */
- (BOOL) enableInputClicksWhenVisible
{
    NSLog(@"enableInputClicksWhenVisible: YES");
    return YES;
}

//------------------------------------------------------------------------------

/**
 * Return Keyboard object.
 *
 * @return UIView of the keyboard.
 */
- (UIView *) getKeyboardView;
{
    return self.keyboard;
}

//------------------------------------------------------------------------------

/**
 * Any of the shot button is pressed.
 *
 * @param sender Shot button object.
 */
- (IBAction)shotButtonPressed:(id)sender
{
    if (!self.delegate) return;

    // play click
    NSLog(@"shotButtonPressed: playInputClick");
    [[UIDevice currentDevice] playInputClick];

    [self.delegate shotButtonDidTouchDown:[(UIButton *)sender currentTitle]];
}

//------------------------------------------------------------------------------

/**
 * The delete button is pressed.
 *
 * @param sender DEL button object.
 */
- (IBAction)deleteButtonPressed:(id)sender
{
    if (!self.delegate) return;

    // play click
    NSLog(@"deleteButtonPressed: playInputClick");
    [[UIDevice currentDevice] playInputClick];
    [self.delegate deleteButtonDidTouchDown];
}

@end

EditShootingResultTableViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    // connect keyboard toolbar
    self.keyboardToolbar = [[KeyboardToolbar alloc] init];
    self.keyboardToolbar.delegate = self;

    // connect shot input keyboard
    self.keyboardShotInputView = [[KeyboardShotInputView alloc] init];
    self.keyboardShotInputView.delegate = self;

    for (UITextField* tf in self.tfShotCollection) {
        tf.inputView = [self.keyboardShotInputView getKeyboardView];
    }

    //...
}

//------------------------------------------------------------------------------
// @name KeyboardShotInputDelegates

/**
 * Receive a message every time the user touches any shot input button.
 */
- (void)shotButtonDidTouchDown:(NSString *)value
{
   // handle keyboard event here...
}

//------------------------------------------------------------------------------

/**
 * Receive a message every time the user touches the shot delete button.
 */
- (void)deleteButtonDidTouchDown
{
     // handle keyboard event here...
}

一切正常。甚至键盘代表的调用。我从enableInputClicksWhenVisible方法中获得了NSLog之外的所有NSLog输出。有人知道出什么问题了吗?几天以来,我找不到任何解决方案。 :-(

问候

最佳答案

试试这个 :

AudioServicesPlaySystemSound(0x450);

10-08 15:43