'NSInvalidArgumentException' 的

时间:2012-11-07 08:47:47

标签: ios annotations compiler-errors pushviewcontroller

我在地图中有一些annotationView,我想用touchUpInside打开一个新的ViewController,但是我收到了这个错误:

 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-
 [MapViewController loadDetailListViewController:]: unrecognized selector sent 
 to instance 0xa042380'

这是MapViewController.m中的代码:

 -(void)loadDetailListViewController{


      if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){

    DetailListViewController *detailList =[[DetailListViewController 
    alloc]initWithNibName:@"DetailListViewController~iPhone" bundle:nil];
    detailList.title = self.chinaTable.title;
    detailList.chinaTable = self.chinaTable;


    [self.navigationController pushViewController:detailList animated:YES];

}else {

    DetailListViewController *detailList =[[DetailListViewController 
    alloc]initWithNibName:@"DetailListViewController~iPad" bundle:nil];
    detailList.title = self.chinaTable.title;
    detailList.chinaTable = self.chinaTable;

    [self.navigationController pushViewController:detailList animated:YES];
}

}

 - (MKAnnotationView *)mapView:(MKMapView *)mapview viewForAnnotation:(id 
    <MKAnnotation>)annotation {

       //......

     UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
       [rightButton addTarget:self action:@selector(loadDetailListViewController:) 
      forControlEvents:UIControlEventTouchUpInside]; //the error is here
      //....
     }

2 个答案:

答案 0 :(得分:3)

更改

@selector(loadDetailListViewController:) 

@selector(loadDetailListViewController)

原因:@selector(abc)为方法abc提供了没有任何参数的选择器。 @selector(abc:)为方法abc的选择器提供了一个参数。因此,@selector(abc::)为方法abc的选择器提供了两个参数对象。

Objective-C是多态的。意思是同一方法可能存在多次。这意味着它们具有相同的名称并且被多次实现以根据参数的数量提供方法的变体(或者如果参数的名称也在选择器语句中给出,则参数的名称也是如此)。

严格说话的abcabc:以及abc::可能完全不同,彼此独立。但那样的风格会非常糟糕。这种方法或多或少地相同并且它们的功能在由传递给它的不同值驱动的细节上变化是相当普遍的。

答案 1 :(得分:2)

在选择器中使用loadDetailListViewController而不是loadDetailListViewController: