我正在使用自定义类来保存一组特定的UITextField设置和inputAccessoryView的启动代码
@interface CustomCountKeyboard : NSObject
它具有以下仅用于UITextField初始化的方法
-(id) initWithField:(UITextField *)field {
self = [super init];
self.titleField = field;
self.titleLabel = nil;
self.titleField.inputAccessoryView = [self makeToolBarWithWidth:self.titleField.superview.frame.size.width];
return self;
}
以及上面的init方法所使用的下面的方法,用于添加附件视图。以下代码中的doneBtn指定了DoneSelectingValue的选择器,该选择器在类的其他位置定义。
-(UIToolbar *) makeToolBarWithWidth:(CGFloat) width {
UIToolbar *toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, width, 44)];
[toolBar setTintColor:[UIColor blueColor]];
NSArray *segItemsArray = [NSArray arrayWithObjects: @"", @"c", @"+", nil];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:segItemsArray];
segmentedControl.frame = CGRectMake(0, 0, 200, 30);
segmentedControl.selectedSegmentIndex = 0;
UIBarButtonItem *segmentedControlButtonItem = [[UIBarButtonItem alloc] initWithCustomView:(UIView *)segmentedControl];
self.segmentedControl = segmentedControl;
UIBarButtonItem *doneBtn=[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(DoneSelectingValue)];
UIBarButtonItem *space=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[toolBar setItems:[NSArray arrayWithObjects:segmentedControlButtonItem,space,doneBtn, nil]];
return toolBar;
}
XCode在此类上未定义此DoneSelectingValue方法时会正确警告我。此类已在其他地方使用,并且可以正确地调用此类中的DoneSelectingValue回调。
但是,在这种情况下,无法在类中调用此方法。感到困惑,我在周围的ViewController中添加了相同的方法定义,并成功调用了该方法。这表明选择器的范围是错误的。
此代码在工作时与未在此实例时的用法之间的唯一区别是,这次的UITextField处于UITableViewCell中,而CustomCountKeyboard的实例化发生在didSelectRowAtIndexPath方法中。如果需要此代码,我可以进行编辑以提供。
如果我插入断点,XCode检查器会在实例化时为'self'显示正确的值(CustomCountKeyboard实例),因此应该正确设置目标。
有什么想法吗?
编辑:根据要求,以下是CustomCountKeyboard的初始化代码
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if( self.textField.text.length > 0 ) {
NSDictionary *species =[self.filteredTableData objectAtIndex:indexPath.row];
[self.obs addObject:species];
[self.textField setText:@""];
[self.textField resignFirstResponder];
self.filteredTableData = [self calculateFilteredResults:self.textField.text];
[self.speciesTable reloadData];
}
else {
TestSpeciesCell *cell = [tableView cellForRowAtIndexPath:indexPath];
CustomCountKeyboard *ff = [[CustomCountKeyboard alloc] initWithField:cell.countField];
[ff StartSelecting];
}
}
开始选择添加的内容
- (void)StartSelecting {
if( self.titleLabel != nil ) {
self.titleLabel.hidden = true;
}
if( self.titleField != nil ) {
self.titleField.hidden = false;
[self.titleField becomeFirstResponder];
}
else {
[self.titleView becomeFirstResponder];
}
}
因此实际上实际上很简单。在选择表行时,我实例化了CustomCountKeyboard的自定义类,并使用它来将inputAccessoryView附加到我传递给它的字段上。不幸的是,UIBarButtonItem的target属性很弱,因此不会阻止类的释放。