当 touchUpInside Back 按钮带有 [self.view removeFromSuperview] 时,上一个视图无响应
Posted
技术标签:
【中文标题】当 touchUpInside Back 按钮带有 [self.view removeFromSuperview] 时,上一个视图无响应【英文标题】:Previous view unresponsive when touchUpInside Back button with [self.view removeFromSuperview] 【发布时间】:2016-04-15 05:53:52 【问题描述】:我是 iPhone 编程新手。
基本上我有一个 MFSideMenuViewController 设置 viewController 作为 rightSideViewController。
设置 ViewController 与 UITableView 一起使用,当我点击 tableview 的任何索引时,它会将另一个 VC 加载为 [rootViewController.view addSubView:VC];
并实现后退按钮代码 - [self.view removeFromSuperview];
直到现在它工作正常
SettingsVC.h
//UITableView Delegate method
if(indexPath.row==1)
VC=[[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"vcStoryBoardIdentifier"];
[VC.view setFrame:[[APP_DELEGATE window] frame]];
[[[[APP_DELEGATE window] rootViewController] view] addSubview:VC.view];
在这个 VC 中,我有一个 tableview。当我点击任何index path.row
时,它正在加载另一个名为 anotherVC 作为子视图的 VC [VC.view addSubView:anotherVC];
VC.m
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTblPS) name:@"VCTblReload" object:nil];
-(void)reloadTblPS
[VCTableView reloadData];
//UITableview DataSource method
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
if(indexPath.row == 0)
button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:img1 forState:UIControlStateNormal];
[button setImage:img2 forState:UIControlStateHighlighted];
[button setFrame:CGRectMake(220,10,60,20)];
[button addTarget:self action:@selector(openAnotherVc:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:button];
return cell;
-(void)openAnotherVc:(id)sender
anotherVC = [[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"anotherVCStoryBoardID"];
[[anotherVC view] setFrame:[[APP_DELEGATE window] frame]];
[self.view addSubview:[anotherVC view]];
-(IBAction)VCcancelBtn:(id)sender
[self.view removeFromSuperview];
//working fine
这个 anotherVC 还包含一个带有 `[anotherVC.view removeFromSuperView]; 的取消按钮
anotherVC.m
-(IBAction)anotherVCcancelBtn:(id)sender
[self.view removeFromSuperView];
[[NSNotificationCenter defaultCenter] postNotificationName:@"VCTblReload" object:nil];
我的问题是这里的 2
1。当我点击 anotherVC 的取消按钮时,它会进入 VC 屏幕,但 VC 没有响应
2。即使我使用了通知和[tableView reloadData];
如果你的回答能解释一下就好了谢谢
【问题讨论】:
你能发布你的代码吗?不完全明白你的问题。 【参考方案1】:试试这个:-
if (indexPath.row == 1)
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ContactUsVC *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"ContactUsVC"];
[self presentViewController:vc animated:NO completion:nil];
在这个方法中也是
-(void)openAnotherVc:(id)sender
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ContactUsVC *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"ContactUsVC"];
[self presentViewController:vc animated:NO completion:nil];
【讨论】:
它不工作。它给出了一个空白的白色屏幕而不是前一个屏幕(VC) 你写的是 (yoursubviewVC).subviews 而不是 self.view.subviews 即 yoursubviewVC 是你要隐藏的 vc 屏幕正在获取 [self.view removeFromSuperview];。那很酷。,但是 VC 视图没有响应或没有交互性。这就是我的问题 你的回答仍然没有解决我的问题 我尝试了不同的方式来解决问题......它工作得很好......谢谢@Aayush Katiyar【参考方案2】:使用Navigation Controller
来做这种事情。然后Push
Viewcontroller 而不是添加到窗口和pop
Viewcontroller 而不是删除。添加和删除是UIView
的好习惯。当涉及到 Viewcontrollers 时,您应该使用 NavigationController
来管理导航堆栈。我认为它将解决您的所有问题。希望这会有所帮助。:)
更新: 如果您使用故事板,那么您也可以使用 segue。它使整个流程更容易一些。谷歌它如何使用带有故事板的导航控制器。
【讨论】:
但在我的项目中,我没有使用任何 segues 和导航控制器。我用不同的场景做了我自己。一些现在正在工作的东西。谢谢@lion 使用导航控制器。这是你强行不能使用的东西吗? 是的。因为数据来自服务。根据设置视图控制器正在加载的数据。所以我不能在这里使用导航控制器【参考方案3】:我的问题的答案是
SettingsVC.h
//UITableView Delegate method
if(indexPath.row==1)
VC=[[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"vcStoryBoardIdentifier"];
[VC.view setFrame:[[APP_DELEGATE window] frame]];
[[[[APP_DELEGATE window] rootViewController] view] addSubview:VC.view];
//[[self presentViewController:VC animated:NO completion:nil];
VC.m
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTblPS) name:@"VCTblReload" object:nil];
-(void)reloadTblPS
[VCTableView reloadData];
//UITableview DataSource method
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
if(indexPath.row == 0)
button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:img1 forState:UIControlStateNormal];
[button setImage:img2 forState:UIControlStateHighlighted];
[button setFrame:CGRectMake(220,10,60,20)];
[button addTarget:self action:@selector(openAnotherVc:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:button];
return cell;
-(void)openAnotherVc:(id)sender
anotherVC = [[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"anotherVCStoryBoardID"];
[[anotherVC view] setFrame:[[APP_DELEGATE window] frame]];
[[self presentViewController:anotherVC animated:NO completion:nil];]
-(IBAction)VCcancelBtn:(id)sender
[self.view removeFromSuperview];
//[self dismissViewControllerAnimated:NO completion:nil];
//working fine
anotherVC.m
-(IBAction)anotherVCcancelBtn:(id)sender
[self dismissViewControllerAnimated:NO completion:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"VCTblReload" object:nil];
【讨论】:
以上是关于当 touchUpInside Back 按钮带有 [self.view removeFromSuperview] 时,上一个视图无响应的主要内容,如果未能解决你的问题,请参考以下文章
带有 Touch Up Inside 和 Touch Repeat 的 UIButton?
在 tableview 滚动时拦截 UITableView 中的 TouchUpInside 事件
使用 IQKeyboardManager 关闭键盘以及触发按钮的 touchupinside 事件