【问题标题】:Creating a UIView subclass that can trigger segues创建一个可以触发 segues 的 UIView 子类
【发布时间】:2015-11-06 14:52:48
【问题描述】:

UIButton、UITableViewCell 等的实例可以用作 Interface Builder 中的 segue 源(即,您可以按住 ctrl 键单击这些对象并将它们链接到情节提要中的控制器)。

我们可以直接创建一个允许相同功能的 UIView 子类吗?如果有,怎么做?

注意:这是问我问题的另一种方式:如何在我自己的类的“触发的 Segues”部分添加项目?这是 UITableViewCell 可以看到的内容:

【问题讨论】:

    标签: ios segue uistoryboard uistoryboardsegue


    【解决方案1】:

    因为我喜欢拥有与 Jean 相同的功能,所以我很困惑。免责声明:我完全是 iOS 和 Apple 的菜鸟,所以我认为一定是我自己和我不明白为什么它不起作用。

    这个“答案”更多的是一种理论,而且可能是一个非常糟糕的理论。如果已经有解决方案,请告诉我。

    理论

    我认为仅通过代码无法扩展/控制“Triggered Segues”部分。似乎 XCode 根据从触发 Segue 显示的对象库中选择的控件知道。

    想法

    只有一个子类,例如UIButton 没有让我在 Connections Inspector 中找到 Triggered Segues 部分。在自定义类部分设置类也无济于事。

    只有当我使用对象库中的按钮时,我才会得到 Triggered Segues 部分。例如。如果我从 UIButton 子类化,我应该使用“按钮”。

    我在 Main.storyboard 中使用了 XML - 每当我将 <subviews><button ... 更改为 <subviews><view ... 时,“Triggered Segues”部分就消失了。把它改回来,它就会出现。见下文。我将包含customClass="IconButton" 属性的元素从按钮更改为视图。

    按钮:触发了转场

    <viewController title="..." id="Zzf-WE-vxI" customClass="MyCustomClass" ... >
        <view key="view" contentMode="scaleToFill" id="Mfn-O2-CMJ">
            <!-- ... -->
            <subviews>
                <button customClass="IconButton" customModule="...">
                    <!-- ... -->
                </button>
    

    视图:无触发转场

    <viewController title="..." id="Zzf-WE-vxI" customClass="MyCustomClass" ... >
        <view key="view" contentMode="scaleToFill" id="Mfn-O2-CMJ">
            <!-- ... -->
            <subviews>
                <view customClass="IconButton" customModule="...">
                    <!-- ... -->
                </view>
    

    结论

    我的结论是 XCode 显示基于情节提要 XML 中的元素/控件的 Triggered Segues 部分 - 它不依赖于我的子类。所以我怀疑是否可以通过代码来控制 Triggered Segues 部分的内容。

    如果我错了,请告诉我。如前所述,我现在对 XCode 的内部没有真正的经验,我很好奇我的理论是否只是废话。

    【讨论】:

    • 我从没想过比较底层的 XML!非常有趣,七十岁。
    • 看起来它在某种程度上是硬连线的,但正如所说,只是一个理论。
    【解决方案2】:

    您可以对更适合您的目的的控件进行子类化。

    在 Xcode 中,您必须将类的名称放在正确的检查器中,如果需要不同的选项,请使用 key-propertyes。

    选择 UIView 后的选项卡会显示为“显示身份检查器”。

    然后您可以访问自定义类区域,您可以选择类名称。

    更复杂的功能是使用“用户定义的运行时属性”

    【讨论】:

    • 然而,UITableViewCell 是 UIView 的一个子类,并且仍然允许 segues... 我如何使用我自己的 UIView 类来做到这一点?
    • 只需将视图放置在您喜欢的位置即可。然后在右侧菜单的“显示身份检查器”选项卡中,您将被允许为自己的项目设置类名和属性(属性)
    • @KikoAlbiolColomer BTW,“海豚”是一只雄性海豚。而“to porpoise”的意思是“像海豚一样移动”?
    • @JulianF.Weinert - 只需单击“编辑”按钮即可修复无害的拼写错误。
    【解决方案3】:

    是的,从视图控制器到视图控制器在情节提要中创建一个 segue。你必须给那个 segue 一个标识符。然后监听该视图上开始的触摸并调用 [self performSegueWithIdentifier@"YOUR IDENTIFER"];

    不,你不能直接让 UIVIEW 有一个动作。您可以添加一个按钮 在此处添加一个按钮以查看

    UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 100)];
    [view setUserInteractionEnabled:NO];
    [view setBackgroundColor:[UIColor redColor]];
    
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn addSubview:view];
    [btn setFrame:CGRectMake(0, 0, 200, 100)];
    [btn addTarget:self action:@selector(click)forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:btn];
    

    或添加点击识别器来查看

    //The setup code (in viewDidLoad in your view controller)
         UITapGestureRecognizer *singleFingerTap = 
      [[UITapGestureRecognizer alloc] initWithTarget:self 
                                          action:@selector(handleSingleTap:)];
    [self.view addGestureRecognizer:singleFingerTap];
    
    //The event handling method
    - (void)handleSingleTap:(UITapGestureRecognizer *)recognizer {
      CGPoint location = [recognizer locationInView:[recognizer.view superview]];
    
     //Do stuff here...
    }
    

    【讨论】:

    • 好建议,但没有回答我的问题。知道如何让 UIView 子类成为 segue 源吗?
    • 然而,UITableViewCell 是 UIView 的一个子类,并且仍然允许 segues... 我如何使用我自己的 UIView 类来做到这一点?
    • 如果你想做,为什么不直接用 UIVIEW 方法来做呢?并说如果 view == myVIEW 执行操作?或在视图中添加触摸识别器?我会进一步更新
    • 它不允许我在情节提要中使用转场。
    • 为什么不呢?您选择了视图控制器并将控件拖到下一个视图控制器吗?
    猜你喜欢
    • 2013-12-03
    • 2021-10-24
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多