Cocoa touch 从子视图刷新UIView

Cocoa touch 从子视图刷新UIView,cocoa-touch,ipad,uikit,notifications,refresh,Cocoa Touch,Ipad,Uikit,Notifications,Refresh,在我的通用应用程序中,我在UIScrollView中有一个UIControl视图 按下设置按钮时,我将另一个视图添加为子视图,如下所示: SetupController *setupview = [[SetupController alloc] initWithNibName:@"SetupView-iPad" bundle:nil]; [mainview addSubview:setupview.view]; 子视图将按预期方式显示。 在这个子视图中,我有一些按钮,允许用户在设置之间切换。

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

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

SetupController *setupview = [[SetupController alloc] initWithNibName:@"SetupView-iPad" bundle:nil];
[mainview addSubview:setupview.view];
子视图将按预期方式显示。 在这个子视图中,我有一些按钮,允许用户在设置之间切换。 执行的操作保存在本地数据库中

问题是:单击子视图中的按钮,我必须刷新主视图,以应用更改。我已经测试了很多方法来实现这一点:

在“子视图”类中:

[self.parentViewController.view setNeedsDisplay];
没有结果

然后我尝试通过通知刷新mainview:

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

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

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

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

[[NSNotificationCenter defaultCenter]添加观察者:自选择器:@selector(refreshView)名称:@“setEmoticon_NOTIFICATION”对象:nil]

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

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

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

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


你知道如何刷新我的主视图吗?

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

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

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

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

        for (UIView* next = [self.view superview]; next; next = next.superview) 
    {
        UIResponder* nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]])
        {
            [(UIViewController*)nextResponder viewWillAppear:YES];
        }
    }
在本例中,我使用superview的viewWillExample方法重新加载superview。 您可以将其替换为任何适合您需要的方法(viewDidLoad、viewWillDissapear等)

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

你的主视图是什么样的?嘿,在子视图中我选择了像图像这样的东西。主视图必须刷新以显示所选图像、大小和新排列的文本描述。为了实现这一点,我的mainview需要再次运行它的方法(viedDidLoad、viewWillDisplay等)并重新绘制xib。我尝试将子视图委托设置为主视图,如您所述。但是setupview.delegate=mainview似乎不起作用。警告是,setupview可能不会响应委托。