0

私が取り組んでいるアプリにはUIViewController、サブクラスとUIViewサブクラスがあります。storyboardビューコントローラーには、UIview. uiview で何かを描画していますが、View Controller から取得する必要がある値を知る必要があります。そこで、View Controller .h ファイルにカスタム プロトコルを作成しました。

@protocol SSGraphViewControllerProtocol <NSObject>

- (void)numberOfSemesters:(int)number;

@end

@property (weak, nonatomic) id <SSGraphViewControllerProtocol> delegate;

クラスでは、UIView上記のプロトコルがあることを確認し、そのメソッドを実装しました。でも。ビューコントローラーから数値を渡すと、UIViewそれを受け取りません。NSLog を使用して、それUIViewが入力されていないことがわかりました- (void)numberOfS:(int)number;。私は何か間違ったことをしていますか? どうすれば修正できますか?UIViewControllerクラスからUIViewコントローラーにデータを送信する別の方法はありますか?

完全なコードは次のとおりです: UIViewController.h

@protocol SSGraphViewControllerProtocol <NSObject>

- (void)numberOfSemesters:(int)number;

@end

@interface SSGraphViewController : UIViewController
@property (weak, nonatomic) id <SSGraphViewControllerProtocol> delegate;
@end

UIViewController.m

@implementation SSGraphViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    [self.delegate numberOfSemesters:2];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

UIView.h

@interface SSGraph : UIView <SSGraphViewControllerProtocol>
@end

UIView.m

static int numberOfS = 0;

@implementation SSGraph

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }

    SSGraphViewController *graph = [[SSGraphViewController alloc] init];
    graph.delegate = self;
    return self;
}

- (void) numberOfSemesters:(int)number{NSLog(@"YES");
    numberOfSemesters= number;
}

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
}
4

3 に答える 3

0

この記事を読んでください、それは説明付きの最良の例です

http://css.dzone.com/articles/do-not-publishcreating-your

プロトコルの作成についてもお読みください

以下に、プロトコルの作成方法の簡単な例を説明します

#DetailViewController.h

#import <UIKit/UIKit.h>

@protocol MasterDelegate <NSObject>
-(void) getButtonTitile:(NSString *)btnTitle;
@end


@interface DetailViewController : MasterViewController

@property (nonatomic, assign) id<MasterDelegate> customDelegate; 

#DetailViewController.m

if([self.customDelegate respondsToSelector:@selector(getButtonTitile:)])
{
          [self.customDelegate getButtonTitile:button.currentTitle];    
}

#MasterViewController.m

create obj of DetailViewController

DetailViewController *obj = [[DetailViewController alloc] init];
obj.customDelegate = self;
[self.navigationController pushViewController:reportTypeVC animated:YES];

and add delegate method in MasterViewController.m for get button title.

#pragma mark -
#pragma mark - Custom Delegate  Method

-(void) getButtonTitile:(NSString *)btnTitle;
{
    NSLog(@"%@", btnTitle);

}
于 2013-03-23T08:53:09.403 に答える
0

initWithFrame: 内にビュー コントローラー インスタンスを作成し、そのデリゲートを自己に割り当ててから、コントローラーへの参照を保持したり、そのビューをビュー階層に追加したりしません。これは確かにあなたが意図したことではありません。代わりに、デリゲート プロパティを IBOutlet にして、ビュー コントローラーを右クリックし、プロパティ名の横にある円からビュー インスタンスにドラッグして接続することにより、ストーリーボードで接続を行います。

余談ですが、この方法でプロトコルを使用することの有用性については確信が持てません。ビューがジョブを実行するために何らかの情報を知る必要がある場合は、必要なインターフェイスを定義するビュー コントローラーに依存するのではなく、コントローラーによって設定できるいくつかのプロパティを公開するか、dataSource プロトコルを宣言してその dataSource を照会する必要があります。

于 2013-03-23T10:14:31.637 に答える
0
// Add an observer to your ViewController for some action in uiview
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(receiveActionNotification:)
                                             name:@"someActionNotification"
                                           object:nil];

// Post Notification and method in your Viewcontroller will be called
[[NSNotificationCenter defaultCenter] postNotificationName:@"someActionNotification" object:self];

// at the end Dont forget to remove Observer.
[[NSNotificationCenter defaultCenter] removeObserver:@"someActionNotification"];
于 2013-03-23T10:34:41.837 に答える