このコードを使用して、iOSアプリケーションのオンスクリーンキーボードの上にボタンを追加しています。私はiOSの9タブレットに電話や事前のiOS 9デバイス上の古いinputAccessoryViewメソッドを使用して、より新しいinputAssistantItemてることに注意してください:inputAssistantItemとinputAccessoryViewがARCで動作しなくなりました
UITextView *textInputMultiline = [[UITextView alloc] initWithFrame:frame];
TextInputToolbar *textInputToolbar = [TextInputToolbar alloc]; // custom class
(void)[textInputToolbar initWithNibName:@"TextInputToolbar" bundle:nil];
textInputToolbar.textView = textInputMultiline;
if ((self.appDelegate.isTablet)&&([[[UIDevice currentDevice] systemVersion] compare:@"9.0"] != NSOrderedAscending)) {
NSMutableArray *barButtonItems = [NSMutableArray array];
[barButtonItems addObject:[[UIBarButtonItem alloc] initWithTitle:@"button 1" style:UIBarButtonItemStylePlain target:textInputToolbar action:@selector(button1)]];
[barButtonItems addObject:[[UIBarButtonItem alloc] initWithTitle:@"button 2" style:UIBarButtonItemStylePlain target:textInputToolbar action:@selector(button2)]];
[barButtonItems addObject:[[UIBarButtonItem alloc] initWithTitle:@"button 3" style:UIBarButtonItemStylePlain target:textInputToolbar action:@selector(button3)]];
UIBarButtonItem *representativeItem = nil;
UIBarButtonItemGroup *group = [[UIBarButtonItemGroup alloc] initWithBarButtonItems:barButtonItems representativeItem:representativeItem];
textInputMultiline.inputAssistantItem.trailingBarButtonGroups = [NSArray arrayWithObject:group];
} else {
textInputMultiline.inputAccessoryView = textInputToolbar.view;
}
マイカスタムツールバークラスは次のようになります。
@interface TextInputToolbar : UIViewController {
UITextView *textView;
IBOutlet UIButton *button1;
IBOutlet UIButton *button2;
IBOutlet UIButton *button3;
}
@property (nonatomic, strong) UITextView *textView;
- (void)insertText:(NSString *)text;
- (IBAction)button1;
- (IBAction)button2;
- (IBAction)button3;
@end
そして...
#import "TextInputToolbar.h"
@implementation TextInputToolbar
@synthesize textView;
- (void)viewDidLoad {
NSLog(@"viewDidLoad");
[super viewDidLoad];
}
- (void)insertText:(NSString *)text {
[self.textView insertText:text];
}
- (IBAction)button1 {
NSLog(@"button1");
[self insertText:@"1"];
}
- (IBAction)button2 {
NSLog(@"button2");
[self insertText:@"2"];
}
- (IBAction)button3 {
NSLog(@"button3");
[self insertText:@"3"];
}
@end
これは、私のアプリケーションがARCを使用していないときに期待通りに機能しました。私は最近、上記のコードに最小限の変更しか必要としないARCに更新しました(私は以前にUIBarButtonItems
でオートレスアを持っていましたが、(void)
のキャストはinitWithNibName
の前にありませんでした)。作業。 iOS 8では、ボタンの1つをタップするとクラッシュする([CALayer button1]: unrecognized selector sent to instance
、無効なメモリポインタを示していると思う)とiOS 9では、ボタンをタップすると何も起こりません。ボタンメソッドのロギングは呼び出されません。
ARCにアップデートする前に私のプロジェクトのコピーを持っています。私がiOS 8またはiOS 9デバイスに戻って実行すると、ツールバーのボタンが再び機能します。だから、ARCは問題の原因か、別の問題の引き金のどちらかと思われます。
私はこのように、自己にbarButtonItemを指している場合、予想通り...
[barButtonItems addObject:[[UIBarButtonItem alloc] initWithTitle:@"button 3" style:UIBarButtonItemStylePlain target:self action:@selector(test)]];
...メソッド呼び出しが受信されます。 barButtonItemセレクタを無効なメソッドに変更すると、...
...何も起こりません。これは、ボタンセレクタが呼び出されるまでにtextInputToolbarが何も表示されないことを示しています。これは、nilでなければ認識できないセレクタクラッシュが発生するためです。
しかし、viewDidLoadのログインが発生し、ビューがinputAccessoryViewの電話機とiOS 8タブレットとして表示されるため、TextInputToolbarクラスとそのビューが読み込まれていることがわかりました。
何が起こっているのか、またトラブルシューティングには他に何ができるのですか?
あなたが正しいです、私はちょうど私が非ARCの機能を壊して確認textInputToolbarにautoreleaseを持っている必要があります。この状況でtextInputToolbarを正しく保持して解放する方法を教えてください。ローカル変数の代わりに親ビューコントローラのインスタンス変数を使用する必要がありますか、またはこのコードブロック内のすべてをどうにかして行うことはできますか? – arlomedia
インスタンス変数である包含ビューコントローラにプロパティを追加する必要があります。 – Wain
ありがとう、それはそれを解決しました。 – arlomedia