iOS:将操作栏按钮委托给其他班级

时间:2015-01-28 00:01:23

标签: ios objective-c delegates uibarbuttonitem

我有一个带有Container的UIViewController,我在导航栏上有一个UIBarButton,我希望按钮的操作转到另一个类View1。

“Embed Segue”的课程我没有表现出来,因为它不需要。

当我点击按钮时没有任何反应,甚至没有日志中的信息(NSLog)。

有人帮助我吗?

我有这个:

//  ViewController.h
#import <UIKit/UIKit.h>

@protocol changeDelegate <NSObject>
-(void) changeLabel;
@end

@interface ViewController : UIViewController

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

@end


//  ViewController.m
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)changeButton:(UIBarButtonItem *)sender {

    [self.delegate changeLabel];

}

@end
//  Container.h

#import <UIKit/UIKit.h>

@interface Container : UIViewController

@end


//  Container.m

#import "Container.h"

@interface Container ()

@end

@implementation Container

- (void)viewDidLoad {
    [super viewDidLoad];

    [self performSegueWithIdentifier:@"segueView1" sender:nil];

}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    [self addChildViewController:segue.destinationViewController];
    [self.view addSubview:((UIViewController *)segue.destinationViewController).view];

}

@end
//  View1.h

#import <UIKit/UIKit.h>

@interface View1 : UIViewController <changeDelegate>

@end


//  View1.m

#import "View1.h"

@interface View1 ()

@property (weak, nonatomic) IBOutlet UILabel *labelView1;

@end

@implementation View1

- (void)viewDidLoad {
    [super viewDidLoad];

}

-(void) changeLabel {
    NSLog(@"Button Action !");
    self.labelView1.text = @"Button Action !";
}

@end

谢谢, JProveta

2 个答案:

答案 0 :(得分:0)

我猜问题是你的委托方法没有解雇。尝试在view.id 的viewdidload中添加它

Viewcontroller *obj  = [[Viewcontroller alloc]init];
obj.delegate = self;

答案 1 :(得分:0)

你看到没有调用-(void) changeLabel,同时ViewController不知道它是谁的委托。你应该在View1.m中为ViewController分配委托,你应该有类似的东西;

ViewController *vC = [ViewController new];
vC.delegate = self; // changeDelegate

然后

[self.delegate changeLabel];

类似于:[view1 changeLabel];然后调用changeLabel。


对于您的项目:

<强> “ViewController.h”      - (IBAction)changeButton:(UIBarButtonItem *)sender {

    [[NSNotificationCenter defaultCenter] postNotificationName:@"change_label_notfication" object:nil];

    //[self.delegate changeLabel];
    NSLog(@"button");

}

<强> “View1.h”

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLabel) name:@"change_label_notfication" object:nil];
}

一些建议:

  1. ViewController是一个视图的控制器,所以 @interface View1 : UIViewController <changeDelegate> View1不是一个好名字。 2.不确定为什么这样做?但对于你的代码来说,它确实是一个不太好的结构。 ViewController.h可以设置一个标签可以控制器属性,“Container.h”在你的观点中没有任何场景。