Как передать данные из родительского представления ребенку при открытии? - PullRequest
1 голос
/ 10 августа 2010

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

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

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

Ответы [ 4 ]

2 голосов
/ 10 августа 2010

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

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

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

MyChildViewController *vc = [[[MyChildViewController alloc] initWithStrings: strings] autorelease];
0 голосов
/ 10 августа 2010

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

@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];
}

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

0 голосов
/ 10 августа 2010
- (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 голосов
/ 10 августа 2010

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

1. Переопределите метод init, как предлагает Мэтт

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];

}
...