iOS: 将操作栏按钮委托给其他 class
iOS: Delegate action bar button to other class
我有一个带有容器的 UIViewController,我在导航栏上有一个 UIBarButton,我希望按钮的动作转到另一个 class,即 View1 的 class。
"Embed Segue" 的 class 我没有显示,因为不需要。
当我点击按钮时没有任何反应,甚至日志 (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
谢谢,
J普罗维塔
我想问题是你的委托方法没有触发。尝试在 view.m
的 viewdidload 中添加这个
Viewcontroller *obj = [[Viewcontroller alloc]init];
obj.delegate = self;
你看没有电话-(void) changeLabel
,同时ViewController也不知道委托人是谁。您应该为 ViewController 分配代表,在 View1.m
中,您应该有类似的东西;
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];
}
一些建议:
- ViewController's 是视图的控制器,所以
@interface View1 : UIViewController <changeDelegate>
View1 不是一个好名字。
2.Not 确定你为什么这样做?但这对您的代码来说确实不是一个好的结构。 ViewController.h可以设置label可以控制器属性,"Container.h"让场景不在你的点。
我有一个带有容器的 UIViewController,我在导航栏上有一个 UIBarButton,我希望按钮的动作转到另一个 class,即 View1 的 class。
"Embed Segue" 的 class 我没有显示,因为不需要。
当我点击按钮时没有任何反应,甚至日志 (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
谢谢, J普罗维塔
我想问题是你的委托方法没有触发。尝试在 view.m
的 viewdidload 中添加这个Viewcontroller *obj = [[Viewcontroller alloc]init];
obj.delegate = self;
你看没有电话-(void) changeLabel
,同时ViewController也不知道委托人是谁。您应该为 ViewController 分配代表,在 View1.m
中,您应该有类似的东西;
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];
}
一些建议:
- ViewController's 是视图的控制器,所以
@interface View1 : UIViewController <changeDelegate>
View1 不是一个好名字。 2.Not 确定你为什么这样做?但这对您的代码来说确实不是一个好的结构。 ViewController.h可以设置label可以控制器属性,"Container.h"让场景不在你的点。