Cocoa touch 从子视图刷新UIView
在我的通用应用程序中,我在UIScrollView中有一个UIControl视图 按下设置按钮时,我将另一个视图添加为子视图,如下所示: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]; 子视图将按预期方式显示。 在这个子视图中,我有一些按钮,允许用户在设置之间切换。
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可能不会响应委托。