从其他 ViewController 中删除带有标签的视图
Posted
技术标签:
【中文标题】从其他 ViewController 中删除带有标签的视图【英文标题】:Removing views with tag from other ViewController 【发布时间】:2014-04-28 02:16:27 【问题描述】:我一直试图从其他 ViewController
调用的操作中删除我的视图,但我不知道该怎么做
这是我的代码:
+ (Menu *)Mostrar:(UIView *)view
CGRect IMGFrame = CGRectMake( 5, 20, 70, 70 );
UIButton *boton=[[UIButton alloc] initWithFrame:IMGFrame];
[boton setBackgroundImage:[UIImage imageNamed:@"Logo_SuperiorBTN.png"] forState:UIControlStateNormal];
[boton setBackgroundImage:[UIImage imageNamed:@"Logo_SuperiorBTN.png"] forState:UIControlStateSelected];
[boton addTarget: self action: @selector(cerrarmenu:) forControlEvents: UIControlEventTouchUpInside];
[boton setTag:899];
[view addSubview: boton];
这部分是像这样从我的MainViewController
调用的
-(IBAction)menu:(id)sender
Menu *hudView = [Menu Mostrar:self.view];
然后它显示视图,当我尝试使用按钮关闭它时它崩溃
关闭菜单的代码是
+(void)cerrarmenu:(UIView *)view
for (UIView *subView in view)
if (subView.tag == 899)
[subView removeFromSuperview];
谢谢 圣地亚哥
【问题讨论】:
"view.subviews" 是要循环的视图数组。但请不要这样做。 你的视图是自定义视图??并且您已将其添加到 MainViewController?现在您想在单击按钮时将其从 MainViewController 中删除(此按钮属于您的自定义视图)。对吗? 【参考方案1】:在最后的代码块中,您用作循环迭代器并调用subview
的UIView
实例实际上并不代表view
的子视图。以下是你应该如何改变它。
+(void)cerrarmenu:(UIView *)view
for (UIView *subView in view.subviews) // UIView.subviews
if (subView.tag == 899)
[subView removeFromSuperview];
这利用了UIView
提供的@property(nonatomic, readonly, copy) NSArray *subviews
。
【讨论】:
他将Target:self 添加到cerarmenu。所以视图=自我。 -> 他无法通过这种方式从超级视图中删除所有视图。唯一的方法是为此 customView 使用委托 @VũTuấnAnh 我该怎么做?【参考方案2】:+(void)cerrarmenu:(UIView *)view
[[view viewWithTag:899] removeFromSuperview];
【讨论】:
最好在您的答案中添加一些关于代码的注释,以描述这是如何解决问题的。【参考方案3】:我会将您的 viewController 称为“PopUpViewController”。 PopViewController.h:
@class PopUpViewController;
@protocol PopUpViewControllerDelegate
//It is delegate -> notify MainViewController to close PopUpViewController
-(void)closeWasCalled: (PopUpViewController*)sender;
@end
@interface PopUpViewController: UIViewController
//Some variables
//Your some properties
//define PopUpViewControlleras delegate
@property (nonatomic, weak) id <MyClassDelegate> delegate;
@end
PopViewController.m:
-(void)btnClose //your close button in PopViewController
[self.delegate closeWasCalled:self]; //MainViewController will catch that
返回主视图控制器 MainViewController.h:
//Add delegate
@interface PopUpViewController: UIViewController<PopViewControllerDelegate>
//Some variables
@property (strong,nonatomic) PopUpViewController* pv;
@end
MainViewController.m
//show PopUpViewController where ever you want
//example viewDidLoad
-(void)viewDidLoad
self.pv = [[PopViewController alloc]init];
//set position...
[self.view addSubView:pv];
//dont forget set delegate
pv.delegate = self; -> it very important
//using delegate
-(void)closeWasCalled: (PopUpViewController*)pvc
[self.pvc removeFromSuperView];
我手写这段代码而不是使用 SDK,因为我使用的是 windows。 但这是你可以遵循的方式 如果为此而陷入困境。我会回答更多
此链接是创建委托的教程:How do I create delegates in Objective-C?
【讨论】:
【参考方案4】:如果您在 Menu 类而不是视图控制器中实现方法“cerrarmenu”,那么您需要执行类似的代码
+(void)cerrarmenu:(UIView *)view
UIButton * btn= (UIButton *)sender;
[[btn superview] removeFromSuperview];
【讨论】:
以上是关于从其他 ViewController 中删除带有标签的视图的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 从其他 Viewcontroller 添加行
如何从 UIAlertcontroller 关闭模态 ViewController
带有部分的 FetchedResultsController