Вызов родительской функции UIViewControllers - PullRequest
0 голосов
/ 23 ноября 2011

Хорошо, у меня проблема, и я не смог найти, что я делаю неправильно.

У меня есть UIVievController с видом, некоторыми функциями и прочим.Один - открыть (с помощью кнопки на листе действий) другой UIVeiwController.Выглядит так:

PersonalSettings *personalSettings;
-(IBAction) displaySettingsMenu:(id)sender
{
    personalSettings = [[PersonalSettings alloc] 
                        initWithNibName:@"PersonalSettings" 
                        bundle:nil];
    [self.view addSubview:personalSettings.view];
    [SettingsSheet dismissWithClickedButtonIndex:0 animated:YES];
}

Это работает как шарм, и я могу делать обновления в этом виде.Когда я закрываю это представление, все настройки обновляются должным образом, и представление исчезает, но я хочу перезагрузить родительский ViewController (Просмотр?), Чтобы я мог видеть новые настройки, которые я сделал.У меня в родительской функции есть функция void, но как я могу ее вызвать?Когда нажата кнопка сохранения в дочернем элементе ViewController, я удаляю представление с помощью:

[self.view removeFromSuperview];

Что я должен сделать здесь, это вызвать функцию обновления из дочернего представления для родительского представления.

Я нашел некоторый код для этого, но за исключением «суперкласса» вместо «superview», так как superview не появляется в списке.Выглядит примерно так:

[self.view removeFromSuperview];

MainViewController *Parent = (MainViewController *)self.superclass;
[Parent updateView];

Есть ли что-то «волшебное», что я могу сделать, чтобы сказать что-то вроде «перезагрузить родительское представление»?

Надеюсь, я сделал проблему понятной.:)

РЕДАКТИРОВАТЬ:

На самом деле спасибо, Гюс, я сейчас ближе.Я не уверен на 100%, как работает эта функция делегата (пока), но я близок к решению.На самом деле, я понял, что даже не нужно запускать метод, просто обновить метку.

От ребенка я написал это:

MainViewController* Parent = [[MainViewController alloc] init];
Parent.delegate = self;
Parent.TheLabel.text = @"foo";

... но это не работает - даже если он действительно находит ярлык и все остальное.И если я из дочернего процесса пытается это сделать:

NSLog(@"Parent label: %@", Parent.TheLabel.text);

, в нем записывается «Родительский ярлык: (ноль)».

Но, тем не менее, я могу теперь получить функцию обновления от дочернего элемента иэто работает.Проблема в том, что эта функция принимает значения из других меток (в родительском представлении), и именно здесь происходит сбой - все они говорят, что null, когда я запускаю функцию от дочернего элемента.Даже если их нет.Есть идеи почему?

Ответы [ 4 ]

1 голос
/ 25 ноября 2011

Так как я просто новичок и добавил дочернее представление как «addSubview», у меня были эти проблемы. Изменение представления с помощью - (void) presentModalViewController: (UIViewController *) modalViewController animated: (BOOL) animated сделал свое дело! Спасибо, в любом случае, особенно благодаря Куби:)

1 голос
/ 23 ноября 2011

Если вы знакомы с моделью делегата, попросите вашего родителя просмотреть делегата и передать информацию обратно от ребенка. Вы найдете несколько хороших документов об этом на веб-сайте Apple.

По сути, вы добавляете поле «делегат» в конструктор вашего ребенка, то есть:

child = [[ViewController alloc] initWithDelegate:this withNibName:@"myNib"];

Затем в дочернем классе, когда вы получаете информацию, вы можете получить доступ к полям / методам в вашем делегате.

- (void) volumeDidChange:(int)volume
{
    delegate.volume = volume
}

или что-то в этом роде. удачи!

0 голосов
/ 23 ноября 2011

Я согласен с aeoliant, использование модели делегата может быть более подходящим. простое объяснение здесь Работа с делегатом в target-c

0 голосов
/ 23 ноября 2011

Если вы ищете общий способ доступа к родительскому элементу данного контроллера, взгляните на этот метод:

+ (YOURTABBARCONTROLLER*)parentTabBarController:(UIResponder*)view {
    id nextResponder = nil;
    id v = view;
    while (nextResponder = [v nextResponder]) {
         if ([nextResponder isKindOfClass:[YOURTABBARCONTROLLER class]])
            return nextResponder;
         v = nextResponder;
    }
    return nil;
 }

Он будет перемещаться по цепочке респондента, чтобы вернуть вам первый класс заданного типа, который найден там. Вы можете иметь YOURTABBARCONTROLLER как UIViewController или указать свой конкретный класс контроллера, чтобы иметь больше контроля. Итак, вы бы сказали, например:

 YOURTABBARCONTROLLER* parent = [self parentTabController:self.view];

(если self - ваш дочерний контроллер, и вы определили в нем вышеуказанный метод).

Это самое близкое, что вы можете получить, AFAIK. Этот метод также может быть превращен в категорию UIViewController, так что он у вас всегда есть.

EDIT:

Если вы используете +, затем вызовите метод следующим образом: [CLASSNAME parentTabController: view], где CLASSNAME - это класс, в котором вы его определили. В любом случае, вы можете использовать - в объявлении метода, и он будет работать с self, как описано.

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

           NSLog(@"Found Responder: %@", nextResponder); //-- ADDED THIS

в качестве первой строки в цикле while, чтобы метод заносил в журнал то, что он находит в цепочке респондента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...