0

ファイル:PeopleLinkEditViewController.h

@protocol  PeopleLinkEditViewControllerDelegate<NSObject>
@optional
-(void)headerInfoEditFinish;

@end
@interface PeopleLinkEditViewController : UITableViewController
{
    id<PeopleLinkEditViewControllerDelegate> delegate;
}

@property (nonatomic, retain) id<PeopleLinkEditViewControllerDelegate> delegate;
-(IBAction)doneEdit:(id)sender;

@end

ファイル:PeopleLinkEditViewController.m


@implementation PeopleLinkEditViewController
...
@synthesize delegate = _delegate;
...
- (void)viewDidLoad
{
...
headerView = [[PeopleLinkHeaderView alloc] initWithFrame:CGRectMake(0, 0, 320, 286)
                                                    passData:headerDic];
...
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if(section == 0)
    {
        return headerView;
    }

    return nil;
}
-(IBAction)doneEdit:(id)sender
{      
    if ([delegate respondsToSelector:@selector(headerInfoEditFinish)])
    {
        NSLog(@"%d", __LINE__);
        [delegate headerInfoEditFinish];
    }
}
@end

ファイル:PeopleLinkHeaderView.h

#import "PeopleLinkEditViewController.h"

@interface PeopleLinkHeaderView : UIView<PeopleLinkEditViewControllerDelegate>
{

}
@end

ファイル:PeopleLinkHeaderView.m

@interface PeopleLinkHeaderView()

@property (nonatomic, retain) PeopleLinkEditViewController *edit;

@end

@implementation PeopleLinkHeaderView

- (id)initWithFrame:(CGRect)frame passData:(NSDictionary *)data
{
    UIStoryboard*  sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                  bundle:nil];
    PeopleLinkEditViewController *edit = [sb instantiateViewControllerWithIdentifier:@"PeopleLinkEditController"];
    edit.editDelegate = self;
}

-(void)headerInfoEditFinish
{
    [baseInfo setValue:baseInfoValue forKey:@"value"];
    [dataPass writeHeaderValueToPlist:baseInfo];
} 

デリゲートのメソッドを呼び出すことはできません。そして、それをデバッグすると、editcontrollerでデリゲートがnilであることがわかります。editcontrollerはストーリーボードによって作成されます。ヘッダービューは、エディットコントローラーのサブビューです。

4

1 に答える 1

3

問題は、アクションの送信先のインスタンスとデリゲートを宣言したインスタンスが同じではないことです。

これを見ればわかります

edit = [[PeopleLinkEditViewController alloc] init];
edit.delegate = self;

これは新しく作成されたインスタンスであり、表示または表示することはありません。おそらく、これはストーリーボードで作成された別のビューコントローラの形式ですか?ストーリーボードで指定したものである場合は、その1つを取得して、そのデリゲートを割り当てる必要があります。

これを使用して、正しいインスタンスを取得します

#import ViewController.h

次に、デリゲートを設定する場所に移動します。

ViewController *tmp = [[self storyboard] instantiateViewControllerWithIdentifier:@"ViewControllerIdentifier"];
tmp.delegate = self;

クラスのヘッダーを含めるように変更し、正しいタグに変更することを忘れないでください。

ここから取得:

https://stackoverflow.com/a/11931714/1068522

于 2012-08-14T06:33:06.847 に答える