objective-c - 这两个delegate的用法效果是一样的吗?
巴扎黑
巴扎黑 2017-04-21 10:57:26
0
3
692

比如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
巴扎黑
巴扎黑

全員に返信(3)
伊谢尔伦

そうあるべき

リーリー

さて、質問の A はクラス名ですが、どうすれば setDelegate を行うことができますか

いいねを押す +0
大家讲道理

質問の意味がよくわかりません。 。 。完全な要件とコードを投稿することをお勧めします。私はあなたが提供した両方のコードスニペットをさまざまな状況で使用しました。 。 。すべては可能です
まず、私は自分の理解に従ってデリゲートの知識を普及させることしかできません。
まず、デリゲートとは何かについて説明します。デリゲートの直訳は代理店と呼ばれます。
その機能の例:
クラス B を制御するコードをクラス A に実装し、クラス B のインスタンス属性デリゲートをクラス A のインスタンスに設定します。

リーリー

デリゲートの原理を理解したところで、質問のコードを見てみましょう

リーリー

は合理的ですが、別の書き方、初期化されたインスタンスにデリゲートを設定するのはより奇妙です (以前にも使用したことがありますが、これは非常に特殊な状況です)
viewDidLoad の問題について話しましょう。この関数は、ビュー全体が初期化され、読み込みが完了した後に呼び出されます。通常、ここで値を割り当て、サブビューを初期化します。

補足

いくつか質問があります
1. デリゲートのクラス名に予約語を使用しないようにしてください。見た目が奇妙すぎます
2.デリゲートの使用方法は、LabelViewControllerでデリゲートインスタンスを定義し、デリゲートメソッドを呼び出すことです
3. デリゲートの実装はButtonViewController

である必要があります

コードは次のとおりです:

LabelViewController.h

リーリー

LabelViewController.m

リーリー

ButtonViewController.h

リーリー

ButtonViewController.m

リーリー
いいねを押す +0
巴扎黑

デリゲートの意味を理解すれば、デリゲートの使い方もわかります。

簡単に言うと、自分では対処できないことが起こり、外部の力に頼る必要があるということです。たとえば、遠くに旅行したい場合、車、電車、飛行機などの交通機関を利用するのは現実的ではありません。これらの車両が特定のプロトコルを実装している限り、車両のメソッドを呼び出すときにエラーが発生しないことが保証されます。

I.delegate = train のように、私が率先してデリゲートを設定するとします。それは間違いではありませんが、デリゲートの柔軟性は存在せず、特定の車両に縛られています。したがって、私の .delegate は外部で設定する必要があります。私の場合、適切なタイミングで my.delegate.go を実行するだけで機能します。代理人が飛行機だったら最高だけど、それがリンケだったら受け入れてください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート