2012-11-07 50 views
1

我在地圖上的一些annotationView,我想與touchUpInside打開一個新的視圖控制器,但我得到這個錯誤:「NSInvalidArgumentException」的

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 
     //.... 
    } 

回答

3

變化

@selector(loadDetailListViewController:) 

@selector(loadDetailListViewController) 

原因:@selector(abc)給出了沒有任何參數的方法abc的選擇器。 @selector(abc:)給出了具有一個參數的方法abc的選擇器。因此,@selector(abc::)給出了方法abc的選擇器兩個參數對象。

Objective-C是多晶型物。意思相同的方法可能存在多次。這意味着它們具有相同的名稱並被多次實現,以根據參數數量(或參數名稱,如果在選擇器語句中給出參數名稱)提供方法的變體。

嚴格地說話abcabc:abc::可能是完全不同的,彼此獨立。但那將是非常糟糕的風格。這些方法或多或少都是相同的,而且它們的功能在傳遞給它的不同值所驅動的細節上有所不同。

2

使用loadDetailListViewController而不是loadDetailListViewController:在選擇器中。

+0

非常感謝 –