当 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];

,VC 中的 tableView 也不会重新加载

如果你的回答能解释一下就好了谢谢

【问题讨论】:

你能发布你的代码吗?不完全明白你的问题。 【参考方案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 事件

带有返回数据的 Flutter Back 按钮

使用 IQKeyboardManager 关闭键盘以及触发按钮的 touchupinside 事件

MonoTouch - UIView.Animate 完成回调未在按钮 touchUpInside 委托内调用

自定义 uitableviewcell 中的交互式弹出手势识别器阻止按钮 touchupinside 事件