从子视图刷新 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的主要内容,如果未能解决你的问题,请参考以下文章