[英]iOS: Delegate action bar button to other class
我有一個帶有容器的UIViewController,並且在導航欄上有一個UIBarButton,並且我希望按鈕的動作進入另一個類,即View1的類。
我沒有顯示“嵌入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
我想問題是您的委托方法沒有觸發。 嘗試將其添加到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];
}
一些建議:
@interface View1 : UIViewController <changeDelegate>
View1不是一個好名字。 2.不確定為什么要這樣做嗎? 但這對於您的代碼來說確實不是一個很好的結構。 ViewController.h可以設置標簽可以控制器屬性,“ Container.h”在您的視線中不會出現任何場景。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.