Обновить UIView из Subview - PullRequest
       32

Обновить UIView из Subview

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

в моем универсальном приложении у меня есть UIControl View внутри UIScrollView.

При нажатии кнопки настройки я добавляю еще один View как подпредставление, например:

SetupController *setupview = [[SetupController alloc] initWithNibName:@"SetupView-iPad" bundle:nil];
[mainview addSubview:setupview.view];

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

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

В классе Subviews:

[self.parentViewController.view setNeedsDisplay];

Безрезультат.

Затем я попытался обновить основное представление уведомлением:

Я добавил это в свой файл класса subviews, в функцию, которая изменяет мои настройки.

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc postNotificationName:@"setEmoticon_NOTIFICATION" object:self];

}

Затем я добавил наблюдателя в мой mainview в методе ViewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver: собственный селектор: @selector (refreshView) имя: @ объект "setEmoticon_NOTIFICATION": nil];

и создал функцию для этого наблюдателя:

-(void)refreshView{
    NSLog(@"Notification!");

    [self.view performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];

}

В журнале я получаю «Уведомление!»на изменение настроек.Но что бы я ни пытался, без обновления.Я пытался установить setNeedsDisplay, resignFirstResponder, [self viewDidLoad:], но все равно ничего не работает.

Есть идеи, как обновить мой основной вид?

Ответы [ 2 ]

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

Черт, да, похоже, я нашел решение, чтобы обновить свое супервизия из подпредставления.Вам нужно только добавить следующий фрагмент кода к желаемому действию / методу, который должен выполнить обновление, в вашем контроллере подпредставления.

        for (UIView* next = [self.view superview]; next; next = next.superview) 
    {
        UIResponder* nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]])
        {
            [(UIViewController*)nextResponder viewWillAppear:YES];
        }
    }

В этом случае я перезагружаю суперпредставление, используя его метод viewWillAppear.Вы можете заменить его любым методом, который соответствует вашим потребностям (viewDidLoad, viewWillDissapear и т. Д.).

Возможно, это не лучший способ сделать это, но он прекрасно работает для меня.Спасибо за ваши ответы.;)

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

Что именно нужно делать при обновлении?Вам нужно перерисовать элементы на экране и т. Д.?У вас есть собственный метод обновления, который вы реализовали в главном окне?Я бы настроил пользовательский протокол в вашем дополнительном представлении, и прежде чем добавить вспомогательное представление к основному представлению, я добавил бы делегат вспомогательного представления в качестве основного представления

    SetupController *setupview = [[SetupController alloc] initWithNibName:@"SetupView-iPad" bundle:nil]; 
    setupView.delegate = mainview; 
    [mainview addSubview:setupview.view];

Затем обработал бы обновление в вызове основного представленияназад.

...