【问题标题】:Refresh UIView from Subview从子视图刷新 UIView
【发布时间】: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:] ,但仍然没有任何效果。

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

【问题讨论】:

  • 你的主视图是什么视图?

标签: cocoa-touch ipad uikit notifications refresh


【解决方案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 等)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多