2012-03-27 17 views
0

iOS5のuitableviewから別の画面にセグをしようとしています。私は動作すると思われるデリゲートなどを設定しました(セグが発生します)が、私は "デリゲートを設定して新しい画面に表示したいデータを初期化する必要があると思います。 prepareforsegue。setDelegateを呼び出すときにNSInvalidArgumentExceptionエラーが発生します

ここでのUITableViewの一部のコードが...

#import "iTanksV2ListViewController.h" 
#import "tank.h" 
#import "tankDetailViewController.h" 

@interface iTanksV2ListViewController() 
@property tank *selectedTank; 
@end 

@implementation iTanksV2ListViewController 
@synthesize tanks = _tanks; 
@synthesize tankTableView = _tankTableView; 
@synthesize delegate = _delegate; 
@synthesize selectedTank = _selectedTank; 


- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
    // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.tankTableView.delegate = self; 
    self.tankTableView.dataSource = self; 
} 

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.identifier isEqualToString:@"Show Tank Details"]) 
    { 
     UILabel *myLabel = [[UILabel alloc] init]; 
     myLabel.text = self.selectedTank.tankNumber; 
     [segue.destinationViewController setTankNumberLabel:myLabel]; 
     [segue.destinationViewController setDelegate:self]; ///this is where it fails!!! 
    } 
} 

#pragma mark - Table view delegate 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    self.selectedTank = [self.tanks objectAtIndex:indexPath.row]; 
    [self.delegate iTanksListViewController:self choseTank:self.selectedTank]; 
} 

あり、その後、詳細ビューでは、私は以下を使用...

-(void)iTanksListViewController:(iTanksV2ListViewController *)sender choseTank:(id)tank 
{ 
    self.tankToShow = tank; 
} 

が、これは取得していません私は正常にsetdelegateメソッドを呼び出さないのでおそらく呼ばれる?

+0

したがって、あなたの 'iTanksV2ListViewController'は両方とも同じプロトコルを実装し、それに従います。私はそれが正しいとは思わない! – tipycalFlow

+0

コンソールに例外の理由が表示されるはずです。通常は、そのメソッドを実装していないオブジェクトにメッセージを送信しているためです。コンソールのNSInvalidArgumentExceptionに続くものは何ですか? – Justin

+0

これはエラーの理由です: ' - [tankDetailViewController setDelegate:]:認識できないセレクタがインスタンス0x687b590に送信されました' – HillInHarwich

答えて

0

デリゲートプロパティを合成してはいけません。

@interface iTanksV2ListViewController : UITableViewController 
@property (nonatomic, strong) NSArray *tanks; 
@property (weak, nonatomic) IBOutlet UITableView *tankTableView; 
@property (weak, nonatomic) id <iTanksV2ListViewControllerDelegate> delegate; 
@end 

と、このMファイルから:また、私は私が...このスニペットはitanksv2listviewcontrollerヘッダからであると思っていたあなたのヘッダファイルが正常にデリゲートプロトコルは

@interface TankDetailViewController : UITableViewController <DELEGATEPROTOCOL> 
+0

このスニペットはitanksv2listviewcontrollerヘッダーにあります: – HillInHarwich

+0

名前が異なる2つのクラスもの。あなたのインターフェイスと実装は同じ名前でなければなりません。 はスーパークラス名の後の.hファイルに入ります。私の例を見てください。また、あなたのUITableViewアウトレットを強く参照する必要があると思います。 – Justin

0

のように参照していることを確認してください:

@synthesize delegate = _delegate; 

、これは私がdetailview mのファイルに入れているものです:

@interface tankDetailViewController() <iTanksV2ListViewControllerDelegate> 
@end 
関連する問題