2015-01-28 1 views
0

У меня есть UIViewController с контейнером, и у меня есть UIBarButton на панели навигации, и я хочу, чтобы действие кнопки перешло к другому классу класса View1.iOS: кнопка панели управления делегатом для другого класса

Класс для «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

+0

Вы подключили свой barButton с помощью (IBAction) changeButton через раскадровку? – AzaFromKaza

+0

Привет, Да, метод '- (IBAction) changeButton: (UIBarButtonItem *) отправитель' ti call. Благодарю. – JProveta

ответ

0

Вы видите, что нет никакого вызова -(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 *) отправитель {

[[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» не создает сцены в вашей точке.
+0

Привет, я пробовал эти два помогает, но не работает :( Спасибо, – JProveta

+0

@JProveta Можете ли вы попробовать NSLog ViewController, чтобы убедиться, что это не ноль? –

+0

Извините, но я не понял, что вы хотите делать? – JProveta

0

Я думаю, проблема в том, что ваш метод делегата не стреляя. Попробуйте добавить это в viewdidload из view.m

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