【问题标题】:How to segue to another view controller when a subview with a gesture is tapped?当点击带有手势的子视图时,如何切换到另一个视图控制器?
【发布时间】:2015-04-07 04:48:51
【问题描述】:

我有一个带有子视图的视图控制器:视图控制器通过插座引用的手势视图。我已将父视图控制器的 viewDidLoad 中的点击手势分配给gestureView,例如:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self.gestureView action:@selector(handleTap)];
[self.gestureView addGestureRecognizer:tapGesture];

gestureView 使用一个自定义类,其中实现了 handleTap: 并且它工作正常,我可以从gestureView 的 handleTap: 记录日志,但是当点击gestureView 时,如何执行从当前视图控制器到另一个视图控制器的 segue。

我知道可能有更简单的方法可以做到这一点,但这最适合我的情况。

【问题讨论】:

    标签: ios objective-c uiview uiviewcontroller xcode6


    【解决方案1】:

    您可以使用 Delegate 模式或 Notification 模式。 两者都适用于您的情况,因为 -handleTap() 方法在您的子视图中实现,您可以在 subview 类 中创建 protocol。 当你得到handleTap方法时,你可以调用应该在你的父类中实现的委托方法。

    在你的子视图类类声明之上定义协议

    @protocol SubViewClassDelegate <NSObject>
    @required;
    - (void) subviewDidTapped:(id) sender;
    @end
    

    定义委托的属性。

    @property (nonatomic, unsafe_unretained) id<SubViewClassDelegate> delegate;
    

    在子视图的类调用委托方法的实现文件中。

    - (void) handleTap   {
            if ([self.delegate respondsToSelector:@selector(subviewDidTapped:)]) {
    [self.delegate subviewDidTapped:yourObject]; // in yourObject you can pass data if require.
    }
    }
    

    在您的父类中实现子视图类的委托

    @interface ParentViewController : UIViewController <SubViewClassDelegate>
    

    viewDidLoad

    self.gestureView.delegate = self;
    

    并在Parent控制器中实现Subview类的委托方法。

    -(void) subviewDidTapped:(id)sender {
    
     // Navigate using performSegueWithIdentifier:
    [self performSegueWithIdentifier: @"segueIdentifier" sender: self];
     }
    

    【讨论】:

    • 如果可能的话,你能修改你的例子来解决segue部分吗
    • 我已经添加了,Raymon 已经给出了答案。但我不喜欢用勺子喂食。养成自己做简单事情的习惯。
    【解决方案2】:

    handleTap 中,对您打算接下来显示的另一个视图控制器执行转场。

     [self performSegueWithIdentifier: @"YOU_SEGUE_IDENTIFIER" sender: self];
    

    您将执行的转场是故事板中从当前视图控制器到下一个视图控制器的转场。 (您需要创建它)。

    您可以将参数传递给prepareForSegue:sender: 中的下一个视图控制器,一旦您通过检查segue 标识符确定它是正确的发送者。

    【讨论】:

    • 这不起作用,因为gestureView的自定义类继承自UIView,它没有实现performSegueWithIdentifier。
    • 是的。对不起那个。我误读了 UITapGestureRecognizer 的初始化。当点击手势被触发时,你有没有在手势视图内部有什么特殊的处理?可以将UITapGestureRecognizer的目标设置为父视图控制器,在VC中实现handleTap方法。在VC的handleTap里面,触发gestureView自带的handleTap方法
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多