0

何らかの理由で、私のカスタム デリゲートは nil です。コードは次のとおりです。

.h

@protocol AssignmentDelgate <NSObject>

-(void)newAssignment:(AssignmentInfo *)assignment;

@end
@property (nonatomic,weak)id<AssignmentDelgate> otherdelegate;

.m

- (IBAction)addTheInfo:(id)sender {
    [self.otherdelegate newAssignment:self.assignmentInfo];
    NSLog(@"%@",self.otherdelegate); //Returning nil!
}

別の VC.h:

@interface AssignmentListViewController : UITableViewController<AssignmentDelgate,UITextFieldDelegate>

@property(strong,nonatomic) AddEditViewController *vc;

@property (strong, nonatomic) NSMutableArray *alist;

別の VC.m

-(void)newAssignment:(AssignmentInfo *)assignment
{
    [self.alist addObject:assignment];
}
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.vc.otherdelegate = self;
    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

デリゲートが nil なのはなぜですか? アプリを書き直しましたが、違いはありませんでした。プロジェクトへのリンク: http://steveedwin.com/AssignmentAppTwo.zip

4

1 に答える 1

1

さて、あなたはセグエプッシュを使用しています。

prepareForSegue を次のように変更する必要があります。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    if ([segue.identifier isEqualToString:@"addAssignment"])
    {
        AddEditViewController *addEditController = segue.destinationViewController;
        [addEditController setOtherdelegate:self];
    }
}

ストーリーボードが実行しているため、self.vc をインスタンス化する必要はありません。

説明 ストーリーボードを使用しているため、ストーリーボードは実際にはビュー コントローラーをインスタンス化しています。これで、ボタンからセグエ経由で次のコントローラーを開くためのリンクが作成されました。

ボタンをタップすると、UIViewController の performSegueWithIdentifier: メソッドが呼び出されて、prepareForSegue でインターセプトできる destinationViewController が作成されます。

アプリで何が起こっていたのか、viewDidLoad 中に AddEditViewController を作成し、それをメモリに保持していました。ボタンを押して AddEditViewController を表示すると、実際にはセグエ経由でクラスの新しいインスタンスが作成されます。

于 2013-10-21T00:17:38.183 に答える