从Subview刷新UIView

时间:2011-11-19 16:20:54

标签: cocoa-touch ipad uikit notifications refresh

在我的通用应用程序中,我在UIScrollView中有一个UIControl视图。

按下设置按钮,我将另一个视图添加为子视图,如下所示:

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

子视图显示为预期。 在这个SubView中我有一些按钮,允许用户在设置之间切换。 执行的操作保存在本地数据库中。

问题是:在SubView中的ButtonClick上,我必须刷新主视图,以应用更改。我已经测试了很多方法来实现这一目标:

在Subviews类中:

[self.parentViewController.view setNeedsDisplay];

没有结果。

然后我尝试通过通知刷新主视图:

我将这个添加到我的子视图classfile中,在更改我的设置的函数中。

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

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

}

然后我在ViewDidLoad方法中将观察者添加到我的主视图中:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshView)name:@“setEmoticon_NOTIFICATION”object:nil];

并为此观察者创建了函数:

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

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

}

在日志中我收到“通知!”在更改设置。但无论我尝试什么,都没有刷新。 我尝试了setNeedsDisplay,resignFirstResponder,[self viewDidLoad:],但仍然无效。

有关如何刷新主视图的任何想法吗?

2 个答案:

答案 0 :(得分:0)

刷新时你到底需要做什么?你需要在屏幕上重绘元素等吗? 您是否在主视图中实现了自定义刷新方法?我会在子视图中设置自定义协议,在将子视图添加到主视图之前,我会将子视图的委托添加为主视图

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

然后在主视图回调中处理刷新。

答案 1 :(得分:0)

天哪,好像我找到了一个从子视图中刷新我的超级视图的解决方案。 您只需在子视图控制器中将以下代码段添加到应执行刷新的所需操作/方法中。

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

在这种情况下,我使用它的viewWillAppear方法重新加载superview。 您可以使用任何符合您需求的方法替换它(viewDidLoad,viewWillDissapear等)。

这可能不是最好的方法,但对我来说效果很好。 谢谢你的回答。 ;)