1

我在地图中有一些 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
      //....
     }
4

2 回答 2

3

改变

@selector(loadDetailListViewController:) 

@selector(loadDetailListViewController)

原因:@selector(abc)给出abc没有任何参数的方法的选择器。@selector(abc:)给出abc带有一个参数的方法的选择器. 相应@selector(abc::)地给出了abc带有两个参数对象的方法的选择器。

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

严格来说abcabc:andabc::可能完全不同并且彼此独立。但那将是非常糟糕的风格。很常见的是,这些方法或多或少是相同的,它们的功能只是在细节上有所不同,由传递给它的不同值驱动。

于 2012-11-07T08:52:35.223 回答
2

在选择器中使用loadDetailListViewControllernot loadDetailListViewController:

于 2012-11-07T08:52:54.797 回答