検索

ホームページ  >  に質問  >  本文

objective-c - 这两个delegate的用法效果是一样的吗?

比如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
巴扎黑巴扎黑2769日前689

全員に返信(3)返信します

  • 伊谢尔伦

    伊谢尔伦2017-04-21 10:59:26

    そうあるべき

    リーリー

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

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-21 10:59:26

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

    リーリー

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

    リーリー

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

    補足

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

    である必要があります

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

    LabelViewController.h

    リーリー

    LabelViewController.m

    リーリー

    ButtonViewController.h

    リーリー

    ButtonViewController.m

    リーリー

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-21 10:59:26

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

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

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

    返事
    0
  • キャンセル返事