IOS目标C选择器使用了错误的范围

问题描述 投票:0回答:1

我正在使用自定义类来保存一组特定的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];
    }

}
ios objective-c xcode scope selector
1个回答
0
投票

因此实际上实际上很简单。在选择表行时,我实例化了CustomCountKeyboard的自定义类,并使用它来将inputAccessoryView附加到我传递给它的字段上。不幸的是,UIBarButtonItem的target属性很弱,因此不会阻止类的释放。

© www.soinside.com 2019 - 2024. All rights reserved.