【问题标题】:How can I embed a UISwitch into a static UITableView?如何将 UISwitch 嵌入到静态 UITableView 中?
【发布时间】:2012-06-03 14:54:49
【问题描述】:

我看到了这个问题:

UISwitch in a UITableView cell

但它似乎正在处理一个动态页面。我真的只是想为我的应用程序和表格中的一些单元格(不是全部)创建一个设置页面,需要在表格单元格上进行开关。我怎么能这样做?

【问题讨论】:

    标签: ios uitableview uikit uiswitch


    【解决方案1】:

    这是它在 Interface Builder 中的工作方式。无需代码。

    • 将 UISwitch 拖到您的视图控制器中。它必须在外部 主视图。有点只是在那儿放松一下,还有其他一些事情。

    • Ctrl 并单击应具有此开关的表格视图单元格,然后 拖动到新的 Switch。见1

    • 将开关连接到表格视图单元格的附件视图插座。见2

    运行应用程序并观察开关出现在表格中 - 完成!

    注意:奇怪的是,该开关没有显示在界面生成器中。但它会在您运行应用程序时显示

    如果您还想将它连接到一个实例变量 - 例如,以便您稍后可以读取它的“on”属性 - 将它连接到一个插座,就像您对任何其他视图 34 一样。

    PS:请记住,UISwitch 的开/关状态是在它的“on”属性中,而不是“selected”。我只是添加这个,因为它有点令人困惑。

    PPS:对不起,我在视网膜屏幕上。

    【讨论】:

    • 这看起来很有希望.. 但在第二步之后,“这将使开关出现在表格中 - 完成!”部分我没有看到开关出现在表格中。我很确定我正确地遵循了这些步骤,因为我看到了黑色的弹出式 Outlets - accessoryView 出现。有什么线索吗?
    • 好吧 - 运行应用程序 - 你看到开关了吗?我刚刚意识到它没有出现在 Interface Builder 中。但是当您运行应用程序时,它将在单元格中。试一试 一旦它对你有用,我会在那里更新措辞。
    • 你说得对,它出现在我想要的正确位置。惊人的!我还在研究如何挂钩开关以在翻转时运行一些代码。有什么指点吗?
    • 是的。使用助手编辑器并按住 Ctrl 键从开关拖动到您的视图控制器类(.h 文件用于 Obj-C,swift 文件用于 swift)。然后,您可以选择创建一个出口,例如变量持有该开关,或创建一个动作。你想创建一个动作。
    • 这是一个非常有帮助的回复,可惜没有得到更多的支持。
    【解决方案2】:

    只需将 UISwitch 拖到您已布局的单元格上。然后,您可以使用助手编辑器(非常棒)将其连接到父类。我会给你一个提示,如果您计划几个外观相似的单元格,请在该部分中创建第一个并将其布置得恰到好处,然后您可以增加该部分中的行数,IB 将创建副本为你现有的行。

    【讨论】:

    • 请注意,要在情节提要时将 UISwitch 元素拖到静态 UITableViewCell 上,单元格的样式必须为“自定义”
    • @Archie1986 它也适用于“基本”单元格,尽管有一些强制。
    • 视频链接坏了,顺便说一句。
    • 我完全这样做了,但是遇到了问题,因为 m IBOutlet 的开启状态没有改变。这就是我发现这个问题的原因。对我来说,它有助于使用发件人的 on 属性而不是我的 IBOutlet。它可能会对某人有所帮助。
    • 它只是将单元格项目放在 uilabel 上方的中心
    【解决方案3】:

    我为这种情况创建了一个函数,它对我很有用.. 试试看,首先在单元格创建中,您可以检查要在其中添加 UISwitch 的行,例如。

     if(indexPath.row == 0)
          [self createOnOffView:cell withTitle:@"Somthing"  withTag:1001 defaultVal:YES];
    

    功能是:

    - (void) createOnOffView:(UITableViewCell*) cell withTitle:(NSString*) title withTag:(int)tag defaultVal:(BOOL) defaultVal
    {
        CGRect rect;
    
        cell.textLabel.text = title;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
        rect = cell.contentView.frame;
    
        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
            rect.origin.x = cell.frame.size.width - 20;
        else
            rect.origin.x = rect.size.width/2 +35;
    
        rect.origin.y = rect.size.height/2 - 15;    
        rect.size.width = 60;    
    
        UISwitch *switchView = [[UISwitch alloc] initWithFrame:rect];
        [cell.contentView addSubview:switchView];
        [switchView addTarget:self action:@selector(didChangeSwitch:) forControlEvents:UIControlEventValueChanged];
    
        switchView.tag = tag;
    
        [switchView setOn:defaultVal];
    
        [switchView release];
    }
    

    当值是 switch 时,这个方法会被触发 .. 所以你可以根据标签知道哪个 switch

    - (void) didChangeSwitch:(UISwitch*)switchView
    {
        if(switchView.tag == 1001)
        {
           //Do Somthing
        }
    
        if(switchView.tag == 1002)
        {
            //Do Somthing
        }    
    }
    

    希望这会有所帮助:)

    【讨论】:

    • 这远没有使用 Interface Builder 将开关拖到您希望它所在的单元格那么简单。看看静态单元表格是如何工作的。使用这些时不需要任何数据源方法,您只需像在常规 ViewController 中一样为对象连接 IBActions。
    【解决方案4】:

    您的操作方式与您在链接到的问题中的方式完全相同。没有“动态”表这样的东西。该表仅显示您的模型。您的模型可能是动态的,但 tableview 不是。无论哪种方式,按照该问题的答案,您将在您的表格视图中进行切换。

    【讨论】:

    • 这是不正确的。从 iOS 5 开始,有不需要任何数据源的静态单元格表​​格视图,相比之下,动态原型单元格需要某种数据源。
    • 很公平。没有意识到这一点。阅读文档后,尽管使用 cellForRowAtIndexPath 似乎仍然更容易。
    • 在我编辑的答案中查看视频链接,我想你会改变对向 SC 电视添加对象是多么容易的想法
    • 我想和所有事情一样,YMMV。对我来说,我将其视为几行代码,可以在与您的视频中完成的时间相同的时间内完成。无论如何,我很欣赏这个视频。非常好。
    • 很公平。感谢您理解不同的观点。与大多数编程方法一样,有几种方法可以完成同一件事。
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2018-10-30
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多