错误:- - [UIButton setValue:]:无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】错误:- - [UIButton setValue:]:无法识别的选择器发送到实例【英文标题】:Error :- -[UIButton setValue:]: unrecognized selector sent to instance 【发布时间】:2013-02-20 14:39:11 【问题描述】:

我创造了 1)表格中的自定义单元格,单元格内有1个按钮和1个滑块。

           NSString *CellIdentifier = [NSString stringWithFormat:@"%d",indexPath.row];

        if (obj_TextCell == nil)                 
                        obj_TextCell = [[[TextCell alloc] initWithStyle:UITableViewCellStyleDefault
                                                       reuseIdentifier:CellIdentifier] autorelease];

           
    UIButton* Btn_music=[[UIButton alloc] initWithFrame:CGRectMake(130,180, 50,50)];

                if (indexPath.row==play_tg)
                
                     [Btn_music setImage:[UIImage imageNamed:@"pausemusic.png"] forState:UIControlStateNormal];

                else
                
                    [Btn_music setImage:[UIImage imageNamed:@"playmusic.png"] forState:UIControlStateNormal];
                             

              [Btn_music addTarget:self action:@selector(playAudio:) forControlEvents:UIControlEventTouchUpInside];
              Btn_music.tag = indexPath.row;
              [obj_TextMusicCell.contentView addSubview:Btn_music];
              [background bringSubviewToFront:Btn_music];
 UISlider *progress = [[UISlider alloc] initWithFrame:CGRectMake(180,195,320,10)];
            [progress setBackgroundColor:[UIColor clearColor]];
            progress.minimumValue = 0.0;
            progress.maximumValue=1.0;
            progress.continuous = YES;
            progress.value = 0.0;
            progress.tag=indexPath.row+1;
            NSLog(@"tag for slider========>%d",progress.tag);
            //[progress setTag:indexPath.row];
            [progress addTarget:self action:@selector(sliderChanged:) forControlEvents:UIControlEventValueChanged];
            [obj_TextMusicCell.contentView addSubview:progress];

2) 我获取单元格的按钮的 IBACTION 事件。并调用了滑块​​移动的方法。

-(IBAction)playAudio:(id)sender

    UIButton *Btn_music=sender;    

    cell_Access = (TextMusicCell *)[tbl_tellTale viewWithTag:0];
    NSIndexPath *indexPath = [tbl_tellTale indexPathForCell:cell_Access];
     NSLog(@"cellindex==>%d",indexPath.row); 
if ( timer==nil)
        
          timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(SongProgress) userInfo:nil repeats:YES];
           [timer fire];
        


3)滑块中的方法有:-

-(IBAction)SongProgress


   UISlider* progress = (UISlider *)[cell_Access viewWithTag:1];

4)它工作得很好。但是当我滚动表格视图或有时应用程序崩溃并给出以下错误:-

-[UIButton setValue:]: unrecognized selector sent to instance 0x96f9660
2013-02-20 19:54:21.008 shc[3776:19d03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIButton setValue:]: unrecognized selector sent to instance 0x96f9660'
*** First throw call stack:
(0x3dba012 0x2777e7e 0x3e454bd 0x3da9bbc 0x3da994e 0x108d1b 0x21c0b90 0x3d79376 0x3d78e06 0x3d60a82 0x3d5ff44 0x3d5fe1b 0x33de7e3 0x33de668 0x16bf65c 0x2cb6 0x2be5 0x1)
libc++abi.dylib: terminate called throwing an exception

-[UIButton setValue:]: 无法识别的选择器发送到实例

请帮帮我

【问题讨论】:

【参考方案1】:

您对 UIBUTTON* btn_music 和 UISlider *progress 使用相同的标签值,因此 UISlider *progress 获取 UIBUTTON 实例 对两者使用不同的标签值,例如如果您为 UIBUTTON 使用 1 到 200 的标签值,然后为 UISlider *progress 使用 201 加值

【讨论】:

【参考方案2】:

您可能正在执行- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 中的第一部分,如果是这样,您将在每次UITableView 需要渲染该单元格时创建新的UIButtonsUISliders...

您应该为UIButtonUISlider 添加属性并检查它们是否已初始化...

编辑:

好的,如果您在自定义 UITableViewCell 中定义了属性Btn_musicprogress,您应该合成它们,然后像​​这样初始化它们:

// If the Button is not yet initialized, then do it
if(obj_TextMusicCell.Btn_music == nil)

    // Here you should do the initialization code that only have to be done the first time
    obj_TextMusicCell.Btn_music=[[UIButton alloc] initWithFrame:CGRectMake(130,180, 50,50)];
    obj_TextMusicCell.Btn_music.tag = indexPath.row;
    [obj_TextMusicCell.contentView addSubview:Btn_music];


// Now it already exists, just update it...
if(indexPath.row==play_tg)

    [obj_TextMusicCell.Btn_music setImage:[UIImage imageNamed:@"pausemusic.png"] forState:UIControlStateNormal];

else

    [obj_TextMusicCell.Btn_music setImage:[UIImage imageNamed:@"playmusic.png"] forState:UIControlStateNormal];

使用UISlider 遵循相同的想法,您就明白了...

【讨论】:

我有 UIButton* Btn_music=[[UIButton alloc] initWithFrame:CGRectMake(130,180, 50,50)];对于滑块:- UISlider *progress = [[UISlider alloc] initWithFrame:CGRectMake(180,195,320,10)];这还不够吗?请指导我..谢谢您的回答。 apascua 感谢您的回复。但是通过在 .h 文件中声明 Btn_music 这将如何帮助我解决问题。如果我在 .h 文件或 .m 文件中声明按钮有什么关系 您需要一个引用,这样您就不会一次又一次地初始化它,并且您需要在 Cell 上下文中使用该引用,因此,如果您想从 UITableViewController 访问,则必须定义它在你的头文件中......希望你能解决它......

以上是关于错误:- - [UIButton setValue:]:无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中,对于 AnyObject,我如何 setValue() 然后调用 valueForKey()

InvalidFirebaseData',原因:'(setValue:)

NumberPicker 在 setValue() 之后显示错误的值

错误:TimeoutException Future 未完成并且 TypeError:T.as 不是 _Future.new 的函数。[_setValue]

我该如何修复此警告信息。警告:忽略“UIButton”实例上的键路径“radius”的用户定义的运行时属性

错误:由于未捕获的异常'NSUnknownKeyException'而终止应用,原因:'[ 的setValue:forUndefinedKey:]