比如A,B两个view,值从A传到B。
在B里面写
A *av = [[A alloc]init]; [av setDelegate:self]
和在A里面写
B *bv = [[B alloc]init]; [self setDelegate:bv];
这句setDelegate要放哪里呢?viewDidLoad?没有报错,但是就是传值不成功。能给我一点提示吗?
#import <Foundation/Foundation.h> @protocol delegate <NSObject> -(void)passString:(NSString *)string; @end
#import <UIKit/UIKit.h> #import "labelViewController.h" #import "delegate.h" @interface buttonViewController : UIViewController @property (weak, nonatomic) IBOutlet UIButton *button; @property (weak,nonatomic) id <delegate> delegate; - (IBAction)buttonPress:(UIButton *)sender; @end
#import "buttonViewController.h" @interface buttonViewController () @end @implementation buttonViewController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { labelViewController *lv = [[labelViewController alloc]init]; [self setDelegate:lv]; [super viewDidLoad]; // Do any additional setup after loading the view. } - (IBAction)buttonPress:(UIButton *)sender { [self.delegate passString:sender.currentTitle]; [self performSegueWithIdentifier:@"push" sender:self]; } @end
#import <UIKit/UIKit.h> #import "delegate.h" @interface labelViewController : UIViewController <delegate> @property (weak, nonatomic) IBOutlet UILabel *label; @end
#import "labelViewController.h" @interface labelViewController () @end @implementation labelViewController - (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. } - (void)passString:(NSString *)string{ self.label.text = string; NSLog(@"%@",self.label.text); } @end
そうあるべき
リーリーさて、質問の A はクラス名ですが、どうすれば setDelegate を行うことができますか
質問の意味がよくわかりません。 。 。完全な要件とコードを投稿することをお勧めします。私はあなたが提供した両方のコードスニペットをさまざまな状況で使用しました。 。 。すべては可能です
リーリーまず、私は自分の理解に従ってデリゲートの知識を普及させることしかできません。
まず、デリゲートとは何かについて説明します。デリゲートの直訳は代理店と呼ばれます。
その機能の例:
クラス B を制御するコードをクラス A に実装し、クラス B のインスタンス属性デリゲートをクラス A のインスタンスに設定します。
デリゲートの原理を理解したところで、質問のコードを見てみましょう
リーリーは合理的ですが、別の書き方、初期化されたインスタンスにデリゲートを設定するのはより奇妙です (以前にも使用したことがありますが、これは非常に特殊な状況です)
補足viewDidLoad の問題について話しましょう。この関数は、ビュー全体が初期化され、読み込みが完了した後に呼び出されます。通常、ここで値を割り当て、サブビューを初期化します。
いくつか質問があります
である必要があります1. デリゲートのクラス名に予約語を使用しないようにしてください。見た目が奇妙すぎます
2.デリゲートの使用方法は、LabelViewControllerでデリゲートインスタンスを定義し、デリゲートメソッドを呼び出すことです
3. デリゲートの実装はButtonViewController
コードは次のとおりです:
LabelViewController.h
リーリーLabelViewController.m
リーリーButtonViewController.h
リーリーButtonViewController.m
リーリーデリゲートの意味を理解すれば、デリゲートの使い方もわかります。
簡単に言うと、自分では対処できないことが起こり、外部の力に頼る必要があるということです。たとえば、遠くに旅行したい場合、車、電車、飛行機などの交通機関を利用するのは現実的ではありません。これらの車両が特定のプロトコルを実装している限り、車両のメソッドを呼び出すときにエラーが発生しないことが保証されます。
I.delegate = train のように、私が率先してデリゲートを設定するとします。それは間違いではありませんが、デリゲートの柔軟性は存在せず、特定の車両に縛られています。したがって、私の .delegate は外部で設定する必要があります。私の場合、適切なタイミングで my.delegate.go を実行するだけで機能します。代理人が飛行機だったら最高だけど、それがリンケだったら受け入れてください。