Использование делегата для передачи данных для резервного копирования стека навигации
Я уже несколько дней сражаюсь с передачей данных между двумя контроллерами представлений и очень запутываюсь. Я новичок в Objective-C и нахожу некоторые детали хитрыми, чтобы развязать голову.
У меня есть контроллер навигации, FirstView - это форма, и в этой форме у меня есть кнопка, которая загружает SecondView, которая содержит TableView, чтобы пользователь мог выбрать некоторые параметры. Затем я хочу передать выбор обратно контроллеру FirstView и отобразить данные и т.д.
Я много читал об этом (stackoverflow, iphonedevsdk, CS 193P Resources), и параметры, которые я видел,
1) ivar в делегате приложения (грязный и не рекомендуется)
2) создать синглтон
3) создать класс модели данных
4) Использовать протоколы и делегаты (рекомендуется яблоком)
Я хочу делать все правильно и хочу использовать опцию 4 - Делегаты в моей программе
Проблема в том, что я не понимаю делегатов и как их устанавливать и внедрять.
Может ли кто-нибудь предоставить базовый пример того, как настроить и передать NSArray с помощью делегата и 2 контроллера представления.
Спасибо заранее
Matt
Ответы
Ответ 1
Делегирование - это правильный шаблон, который будет использоваться в этом случае, но ваше описание не похоже на делегирование, поскольку оно использует глобальную переменную. Возможно, вы храните глобальные переменные в своем делете приложения, которые вы всегда должны избегать.
Вот грубая схема того, как выглядит код:
SecondViewController.h
@protocol SecondViewControllerDelegate;
@interface SecondViewController;
SecondViewController : UIViewController
{
id<SecondViewControllerDelegate> delegate;
NSArray* someArray;
}
@property (nonatomic, assign) id<SecondViewControllerDelegate> delegate;
@property (nonatomic, retain) NSArray* someArray;
@end
@protocol SecondViewControllerDelegate
- (void)secondViewControllerDidFinish:(SecondViewController*)secondViewController;
@end
SecondViewController.m
@implementation SecondViewController
@synthesize delegate;
@synthesize someArray;
- (void)dealloc
{
[someArray release];
[super dealloc];
}
- (void)someMethodCalledWhenUserIsDone
{
[delegate secondViewControllerDidFinish:self];
}
FirstViewController.h:
#import SecondViewController
@interface FirstViewController : UIViewController <SecondViewControllerDelegate>
{
...
}
@end
FirstViewController.m
@implementation FirstViewController
- (void)secondViewControllerDidFinish:(SecondViewController*)secondViewController
{
NSArray* someArray = secondViewController.someArray
// Do something with the array
}
@end
Ответ 2
Вплоть голову. Вы можете заменить _returnedProperty
на свой пользовательский объект, а в методе setReturnedProperty
сделать все волшебство, прежде чем фактически назначить проверенное значение из таблицы.
@interface FormController : UIViewController {
NSString *_returnedProperty;
}
@property (nonatomic, retain) NSString *returnedProperty;
@end
@implementation FormController
- (void)showChoices {
TableController *tv = [[TableController alloc] initWithDelegate:self];
[self.navigationController pushViewController:tv animated:YES];
[tv release];
}
- (void)setReturnedProperty:(NSString *)string {
NSLog(@"Setting property as a delegate");
[_returnedProperty release];
_returnedProperty = [string retain];
}
@synthesize returnedProperty=_returnedProperty;
@end
@interface TableController : UITableViewController {
id _delegate
}
@end
@implementation TableController
- (id)initWithDelegate:(id)delegate {
self = [super initWithStyle:UITableViewGroupedStyle];
if (!self) return nil;
_delegate = delegate;
return self;
}
- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// do the data retrieval stuff
NSString *returnedProperty = @"foo";
[_delegate setReturnedProperty:returnableProperty];
}
@end
Ответ 3
На этот же вопрос был дан ответ:
Передайте переменную между множеством UIVIewControllers
Надеюсь, это будет легко и достаточно.....
Ответ 4
В итоге я использовал этот пример
Обмен данными между диспетчерами и другими объектами @iPhone Dev SDK
Работал нормально и разрешил мне передавать строку и массив вперед и назад между моими представлениями.
Спасибо за вашу помощь
Ответ 5
Вы можете использовать раскадровку довольно легко. Используйте это в реализации SecondViewController
и создайте свойство в VIewController.h
(первый контроллер представления) с именем dataFromSecondView
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSString *textvalue = self.SecondViewText.text;
ViewController *destination = segue.destinationViewController;
destination.dataFromSecondView = textvalue;
}