我正在使用此代碼在iOS應用中的屏幕鍵盤上方添加一些按鈕。請注意,我用的手機和預先的iOS 9器件,老inputAccessoryView方法和iOS 9片的新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
上有自動釋放,並且在initWithNibName
之前沒有(void)
),現在按鈕仍然按預期顯示,但不顯示工作。在iOS 8上,當點擊其中一個按鈕([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在調用按鈕選擇器時會以某種方式變爲零,因爲如果它不爲零,則會產生無法識別的選擇器崩潰。
但我知道TextInputToolbar類及其視圖正在加載,因爲在viewDidLoad中進行了日誌記錄,並且因爲該視圖顯示爲inputAccessoryView,因此手機和iOS 8平板電腦都是這樣。
任何想法發生了什麼,或者我能做些什麼來排除故障?
你說得對,我應該在textInputToolbar上有一個autorelease,我剛剛確認會打破非ARC的功能。你能告訴我如何在這種情況下正確保留和釋放textInputToolbar嗎?我是否需要使用父視圖控制器的實例變量而不是本地變量,或者我可以以某種方式執行此代碼塊中的所有操作? – arlomedia
您需要將屬性添加到包含視圖控制器,實例變量,是。 – Wain
謝謝,解決了它。 – arlomedia