从子视图刷新 UIView

Posted

技术标签:

【中文标题】从子视图刷新 UIView【英文标题】:Refresh UIView from Subview 【发布时间】:2011-11-19 16:20:54 【问题描述】:

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

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

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

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

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

在子视图类中:

[self.parentViewController.view setNeedsDisplay];

没有结果。

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

我将此添加到我的子视图类文件中,在更改我的设置的函数中。

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 

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


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

[[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector(refreshView) name:@"setEmoticon_NOTIFICATION" object:nil];

并为此观察者创建函数:

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

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


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

任何想法如何刷新我的主视图?

【问题讨论】:

你的主视图是什么视图? 【参考方案1】:

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

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

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

【讨论】:

嘿,在子视图中,我选择了类似图像的东西。 MainView 必须刷新才能显示选定的图像、大小和新排列的文本描述。为了实现这一点,我的主视图需要再次运行它的方法(viedDidLoad、viewWillAppear 等)并重新绘制 xib。我尝试像您描述的那样将子视图委托设置为主视图。但是 setupview.delegate = mainview 似乎不起作用。 setupview 可能无法响应委托,是警告。【参考方案2】:

是的,似乎我找到了从子视图刷新我的超级视图的解决方案。 您只需在子视图控制器中将以下代码 sn-p 添加到应执行刷新的所需操作/方法。

        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 等)。

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

【讨论】:

以上是关于从子视图刷新 UIView的主要内容,如果未能解决你的问题,请参考以下文章

从子视图调用超级视图函数

从子视图中的路径对象在 UIView 中构建剪辑区域

将图像从子视图绘制到父视图

iOS:如何将触摸事件从子视图转发到超级视图? [复制]

如何从子视图内的编程 UIButton 执行 segue?

从子视图中访问 UIViewController 方法