Как передать данные из родительского представления в дочернее при открытии?

Я хочу загрузить данные (массив строк) из родительского представления в набор UITextFields в дочернем представлении при представлении modalView .

Я знаю, как переходить от ребенка к родителю, и я уверен, что еще проще пойти другим путем, но я не знаю, как это сделать.

ОБНОВЛЕНИЕ: Обновление удалено, потому что я обнаружил проблему (двойное отключение модального представления)

1
задан Brian Tompsett - 汤莱恩 19 December 2015 в 09:54
поделиться

4 ответа

Переопределить метод инициализации для дочернего контроллера представления.

- (id) initWithStrings:(NSArray *)string {
    if (self = [super init]) {
        // Do stuff....
    }
    return self;
}

Затем в родительском:

MyChildViewController *vc = [[[MyChildViewController alloc] initWithStrings: strings] autorelease];
2
ответ дан 2 September 2019 в 22:18
поделиться

Это можно сделать двумя способами:

1. Отмените метод инициализации, как предлагает Мэтт

2. Создайте поля в своем дочернем классе и передайте эти значения в текстовое поле.

@interface ChildViewController : UIViewController{
    NSArray *strings;
    UITextfield *textField1;
    UITextfield *textField2;
}
...

- (void)viewDidLoad {
    [super viewDidLoad];
    textField1.text = [strings objectAtIndex:0];
    textField2.text = [strings objectAtIndex:1];
}

Затем в родительском классе:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ChildViewController *childController = [[ChildViewController alloc] init];
    childController.strings = your_array_of_strings;
    [self.navigationController pushViewController:childController animated:YES];
    [childController release];

}
0
ответ дан 2 September 2019 в 22:18
поделиться
- (id)initWithDataObject:(YourDataObjectClass *)dataObject {
    if (self = [super init]) {
        self.dataObject = dataObject;
        // now you can do stuff like: self.myString = self.dataObject.someString;
        // you could do stuff like that here or if it is related to view-stuff in viewDidLoad
    }
    return self;
}
0
ответ дан 2 September 2019 в 22:18
поделиться

Если вы хотите по-настоящему фантазировать, вы можете сделать делегата для своего дочернего представления.

@protocol MyChildViewDelegate
- (NSArray*)getStringsForMyChildView:(MyChildView*)childView;
@end

@interface MyChildView : UIView
{
    id <MyChildViewDelegate> delegate;
    ...
}

@property (nonatomic, assign) id <MyChildViewDelegate> delegate;
...
@end

Затем где-нибудь в вашем представлении вы бы попросили строки:

- (void)viewDidLoad
{
    ...
    NSArray* strings = [delegate getStringsForMyChildView:self];
    ...
}

Затем в вашем контроллере (или где-либо еще) вы можете сделать:

myChildView = [[MyChildView alloc] initWith....];
myChildView.delegate = self;

...

- (NSArray*)getStringsForMyChildView:(MyChildView*)childView
{
    return [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
}

В данном случае это, вероятно, немного излишне, но вот как это делают UITableViews тоже: у них есть делегат источника данных, чтобы предоставить им свое содержимое.

0
ответ дан 2 September 2019 в 22:18
поделиться