Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > iOS > не работает delegate


Автор: JohnyBlackbird 19.3.2014, 19:32
Всем привет, у меня такая проблема, не получается написать делегат. По задумке есть 2 вью контроллера, в одном из них есть UItextBox, в который юзер вводит число с плавающей точкой, и кнопка. Число должно передаваться в другой вью контроллер по нажатию кнопки и выводиться там в UIabel. Но этого не происходит. Я тут выложил свой код, подскажите, что я неправильно делаю?
FirstViewController.h
Код

#import <UIKit/UIKit.h>
#import "DelegateProtocol.h"
@interface FirstViewController : UIViewController{
 IBOutlet UITextField *textfield1, *textfield2;
   __unsafe_unretained id <DelegateProtocol> _delegate;

}
@property (nonatomic, assign) id <DelegateProtocol> delegate;
- (IBAction) ButtonClick:(id) sender;
@end
;


FirstViewController.m
Код

#import "FirstViewController.h"

/*@interface FirstViewController ()

@end*/

@implementation FirstViewController
@synthesize delegate=_delegate;
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (IBAction) ButtonClick:(id) sender{
    float g = [textfield1.text floatValue];
    [self.delegate SendA:g];
    
}

@end



Код

#import <UIKit/UIKit.h>
#import "DelegateProtocol.h"
#import "FirstViewController.h"
@interface SecondViewController : UIViewController<DelegateProtocol> {
    float _a, _b;
    IBOutlet UILabel * Alabel, *Blabel;
}
@property float a, b;
@end


SecondViewController.m
Код

#import "SecondViewController.h"

/*@interface SecondViewController  ()

@end*/

@implementation SecondViewController
@synthesize a=_a;
- (void)viewDidLoad
{
    [super viewDidLoad];
    FirstViewController * testAppViewController = [[FirstViewController alloc] init];
    testAppViewController.delegate = self;
    // Do any additional setup after loading the view, typically from a nib.
}
-(void) SendA:(float) A{
    self.a = A ;
    NSString *str = [NSString stringWithFormat:@"%f", self.a];
    [Alabel  setText:str];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

Автор: Bitter 19.3.2014, 20:10
а кто у вас первым то запускается?

Автор: JohnyBlackbird 19.3.2014, 20:18
Цитата(Bitter @ 19.3.2014,  20:10)
а кто у вас первым то запускается?

FirstViewController. Я думал, это из названия ясно.

Автор: Maksys 19.3.2014, 20:32
я в упор не вижу ни реализацию делегата, ни его методов, ни их вызовов..... яб тоже ни чего ни делал при нажатии кнопки.

Автор: JohnyBlackbird 19.3.2014, 20:51
Если вы про сам протокол, то вот он.
DelegateProtocol.h
Код

#import <Foundation/Foundation.h>

@protocol DelegateProtocol <NSObject>
- (void) SendA:(float)A;
@end


Автор: Bitter 19.3.2014, 20:53
Цитата(JohnyBlackbird @  19.3.2014,  20:18 Найти цитируемый пост)
FirstViewController. Я думал, это из названия ясно.

Из названия ясно что он должен быть первым, а не то что он первым вызывается.

Я вижу что вы создаете FirstViewController внутри SecondViewController. Это значит что первым запускается именно SecondViewController

Автор: JohnyBlackbird 19.3.2014, 21:02
Цитата(Bitter @ 19.3.2014,  20:53)
Цитата(JohnyBlackbird @  19.3.2014,  20:18 Найти цитируемый пост)
FirstViewController. Я думал, это из названия ясно.

Из названия ясно что он должен быть первым, а не то что он первым вызывается.

Я вижу что вы создаете FirstViewController внутри SecondViewController. Это значит что первым запускается именно SecondViewController

При запуске программы первым открывается окно, за которое отвечает FirstViewController. А FirstViewController внутри SecondViewController создаётся, чтобы потом объявить SecondViewController делегатом. Или я что-то не так делаю?

Автор: Bitter 19.3.2014, 21:04
конечно не так, вы создаете еще один FirstViewController, новый

Добавлено через 2 минуты и 25 секунд
Еще вопрос - а где вы создаете SecondViewController ?

Автор: JohnyBlackbird 19.3.2014, 21:18
Цитата(Bitter @ 19.3.2014,  21:04)
конечно не так, вы создаете еще один FirstViewController, новый

Добавлено @ 21:06
так а как нужно сделать?
Еще вопрос - а где вы создаете SecondViewController ?

Там через TabBar вьюшки переключаются. Есть TabBarViewController - родительский контроллер из которого вызываются оба дочерних.

Автор: Bitter 19.3.2014, 21:43
ну тогда если вы хотите передавать данные из одного контроллера в другой, то вы должны переопределить класс таб бара, и в его viewDidLoad получить доступ к этим двум контроллерам. Получив доступ назначите одного в качестве делегата второго

Добавлено через 2 минуты и 21 секунду
либо второй вариант по проще - создать класс синглтон и передавать данные через него
есть еще вариант с NSNotification. В первом контроллере отправляете NSNotification, во втором контроллере его ловите. В нотификэйшене можете передать self в качестве userInfo и его потом использовать для установления делегата

Добавлено через 5 минут и 14 секунд
Ну и пожалуй самый правильный вариант (как я бы сделал):
- переопределить класс таб бара
- назначить в качестве делегата именно класс таб бара (то есть данные от первого контроллера будут приходить в таб бар)
- при получении данных таб бар передает данные второму контроллеру, вызывая какой-нибудь его метод

Автор: tilanata 19.3.2014, 23:03
А не пробовали что то из живого кода скачать и потом прикрутить по аналогии к себе? Вы же не так все делаете? Запускаете все гамузом и пытаетесь потом определиться:)) Я позно зашла, вам уже вижу рассказали:))

Автор: JohnyBlackbird 19.3.2014, 23:14
Цитата(Bitter @ 19.3.2014,  21:43)
ну тогда если вы хотите передавать данные из одного контроллера в другой, то вы должны переопределить класс таб бара, и в его viewDidLoad получить доступ к этим двум контроллерам. Получив доступ назначите одного в качестве делегата второго

Добавлено @ 21:46
либо второй вариант по проще - создать класс синглтон и передавать данные через него
есть еще вариант с NSNotification. В первом контроллере отправляете NSNotification, во втором контроллере его ловите. В нотификэйшене можете передать self в качестве userInfo и его потом использовать для установления делегата

Добавлено @ 21:49
Ну и пожалуй самый правильный вариант (как я бы сделал):
- переопределить класс таб бара
- назначить в качестве делегата именно класс таб бара (то есть данные от первого контроллера будут приходить в таб бар)
- при получении данных таб бар передает данные второму контроллеру, вызывая какой-нибудь его метод

а что вы имеете в виду под "переопределить класс таббара"? Создать свой класс, занаследовать его от UITabBarViewController и привязать его к моему таб бару?

Автор: JohnyBlackbird 20.3.2014, 00:35
Всё, спасибо, всё получилось. Переопределил UITabBarController и использовал его в качестве буфера(сделал его делегатом).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)