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

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

membalas semua(3)
伊谢尔伦

sepatutnya

A *av = [A alloc]init];
[av setDelegate:self]

Nah, A dalam soalan ialah nama kelas, bagaimana saya boleh setDelegate?

大家讲道理

Saya tidak begitu faham maksud soalan itu. . . Saya cadangkan anda menyiarkan keperluan dan kod yang lengkap. Saya telah menggunakan kedua-dua coretan kod yang anda berikan dalam situasi yang berbeza. . . Semuanya boleh
Pertama, saya hanya boleh mempopularkan ilmu perwakilan mengikut pemahaman saya.
Biar saya jelaskan dahulu apa itu delgate Terjemahan literal delgate dipanggil agensi.
Contoh fungsinya:
Laksanakan kod yang mengawal kelas B dalam kelas A, dan tetapkan perwakilan atribut contoh kelas B kepada contoh kelas A.

@@implementation A
- (void)viewDidLoad
{
    UITableView *b;
    b.delegate = self; // 这个self就是A的实例
}

// 这就是一个Delgate方法,本来是控制UITableView的,但是在A中实现,通过UITableView的实例b的属性delegate联系起来。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 44.f;
}

@end

Setelah memahami prinsip perwakilan, mari lihat kod dalam soalan anda

A *av = [[A alloc]init];
[av setDelegate:self]

adalah munasabah, tetapi cara penulisan lain, menetapkan Perwakilan kepada contoh yang dimulakan adalah pelik (walaupun saya telah menggunakannya sebelum ini, tetapi ia adalah kes yang sangat istimewa)
Mari kita bincangkan tentang isu viewDidLoad Fungsi ini dipanggil selepas keseluruhan View dimulakan dan pemuatan selesai. Secara amnya, anda menetapkan nilai di sini dan memulakan subview.

Supplement

Ada beberapa soalan
1. Cuba jangan gunakan perkataan simpanan dalam nama kelas perwakilan, ia kelihatan terlalu pelik
2. Penggunaan perwakilan adalah untuk mentakrifkan contoh perwakilan dalam LabelViewController dan kemudian memanggil kaedah perwakilan
3. Pelaksanaan perwakilan hendaklah ButtonViewController

Kod adalah seperti berikut:

LabelViewController.h

#import <Foundation/Foundation.h>

@protocol LabelDelegate <NSObject>

-(NSString *)passString;

@end

@interface labelViewController : UIViewController <delegate>

- (void)pass;

@property (weak, nonatomic) IBOutlet UILabel *label;
@property (assign, nonatomic) id<LabelDelegate> delegate;

@end

LabelViewController.m

#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)pass {
    if ([self.delegate respondsToSelector:@selector(passString)]) {
        self.label.text = [self.delegate passString];
    }
}

@end

ButtonViewController.h

#import <UIKit/UIKit.h>
#import "LabelViewController.h"

@interface ButtonViewController : UIViewController <LabelDelegate>

@property (weak, nonatomic) IBOutlet UIButton *button;
@property (strong, nonatomic) LabelViewController *lv;

- (IBAction)buttonPress:(UIButton *)sender;

@end

ButtonViewController.m

#import "ButtonViewController.h"

@interface ButtonViewController ()

@end

@implementation ButtonViewController

@synthesize lv;

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

- (void)viewDidLoad
{
        [super viewDidLoad];

        self.lv = [[LabelViewController alloc] init];
        [lv setDelegate:self];

        // Do any additional setup after loading the view.
}

- (NSString *)passString
{
    return self.button.currentTitle;
}

- (IBAction)buttonPress:(UIButton *)sender {
    [self.lv pass];
}

@end
巴扎黑

Jika anda faham maksud delegate, anda akan tahu cara menggunakan delegate.

Ringkasnya, sesuatu telah berlaku dan saya tidak dapat menanganinya, jadi saya perlu menggunakan kuasa luar. Sebagai contoh, jika saya ingin pergi jauh, pastinya tidak praktikal untuk pergi Dalam kes ini, saya perlu menggunakan pengangkutan, seperti kereta, kereta api, dan kapal terbang. Selagi kenderaan ini melaksanakan protokol tertentu, ia dipastikan tidak akan berlaku ralat semasa memanggil kaedah kenderaan.

Jika saya mengambil inisiatif untuk menetapkan perwakilan, seperti: I.delegate = kereta api. Ia tidak salah, tetapi ia tidak masuk akal. Fleksibiliti perwakilan tidak wujud, dan saya terikat dengan kenderaan tertentu. Jadi .delegate saya perlu ditetapkan secara luaran. Bagi saya, hanya melaksanakan my.delegate.go pada masa yang sesuai berfungsi. Alangkah baiknya jika perwakilan itu adalah kapal terbang Jika ia adalah Linke, terima saja.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan