【发布时间】:2016-11-12 02:46:20
【问题描述】:
我正在使用此代码在我的 iOS 应用程序的屏幕键盘上方添加一些按钮。请注意,我在手机和 iOS 9 之前的设备上使用较旧的 inputAccessoryView 方法,在 iOS 9 平板电脑上使用较新的 inputAssistantItem:
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 上有自动释放,并且在 initWithNibName 之前没有 (void) 演员表),现在按钮仍然显示为预期,但不工作。在 iOS 8 上,我在点击其中一个按钮时崩溃([CALayer button1]: unrecognized selector sent to instance,我认为这表示内存指针无效),在 iOS 9 上,当我点击一个按钮时没有任何反应,并且按钮方法的日志记录是没有调用。
在更新到 ARC 之前,我有一个项目的副本,当我返回并在我的 iOS 8 或 iOS 9 设备上运行它时,工具栏按钮再次起作用。所以看起来 ARC 要么是问题的根源,要么是另一个问题的触发器。
如果我将 barButtonItem 指向 self,像这样...
[barButtonItems addObject:[[UIBarButtonItem alloc] initWithTitle:@"button 3" style:UIBarButtonItemStylePlain target:self action:@selector(test)]];
...按预期接收方法调用。如果我将 barButtonItem 选择器更改为无效方法,像这样...
[barButtonItems addObject:[[UIBarButtonItem alloc] initWithTitle:@"button 3" style:UIBarButtonItemStylePlain target:textInputToolbar action:@selector(flkjfd)]];
...什么也没发生。这表明在调用按钮选择器时 textInputToolbar 以某种方式变为 nil,因为如果它不是 nil,这将导致无法识别的选择器崩溃。
但我知道 TextInputToolbar 类及其视图正在加载,因为在 viewDidLoad 中发生了登录,并且因为视图显示为 inputAccessoryView 手机和 iOS 8 平板电脑。
知道发生了什么,或者我还能做些什么来排除故障?
【问题讨论】:
标签: ios automatic-ref-counting uitextinput