在 Switch Case 中声明 UI 对象

2023-12-15

我读过有关开关盒范围的内容,跳转标签等等,但是 SO 这里建议的解决方案似乎意味着添加花括号可以避免这个问题。然而,这似乎仍然不起作用:

switch (objectType) {

  case label:   //label is an integer constant
    NSLog(@"statement before declaration");
    UILabel *control = [[UILabel alloc] init];       //no error
    break;

  case button:  //button is an integer constant
    {
      UIButton *control = [[UIButton alloc] init];   //no error
    }
    break;    

  default:
    break;
}

// error when trying to use the *control* variable,
// Use of undeclared identifier 'control'

有什么办法可以用 switch 语句来实现这一点吗?


2015 年 5 月 23 日:尝试了许多不同的方法但没有成功。

编辑:实施西里尔建议的解决方案时出现错误:

UIView *control = nil;
switch (objectType)
{
  case label:  //button is an integer constant
    {
      control = [[UILabel alloc] init];   //no error

      //error: property 'text' not found on object of type 'UIView *'
      control.text = @"Something...";     
    }
    break; 

  default:
    break;
}

显然,即使在重铸之后UIView to UILabel,该对象没有继承所有属性UILabel,因此出现错误:

在“UIView *”类型的对象上找不到属性“文本”

甚至 Zil 也建议为类型添加前缀(UILabel*)[[UILabel alloc]init];不工作。

有人让它发挥作用吗?


DUNCAN C. 的解决方案 (参见下面接受的答案)

    UIView *control = nil;
    switch (objectType)
    {
        case label:  
            control = [[UILabel alloc] init];
            ((UILabel *)control).text = @"Something...";     
            break; 

        default:
            break;
    }

    // UI object instantiated inside switch case recognised!
    ((UILabel *)control).textColor = [UIColor redColor];

谢谢邓肯·C.


Objective-C 中的作用域规则非常简单。每当您输入一对大括号时,您就进入了一个新的范围级别。在该范围内声明的任何变量仅存在于该范围内。当退出大括号时,变量将不再存在。

switch 内的各个 case 不需要大括号,因此它们不定义本地级别的范围,而是定义整个 switch 语句does使用大括号,因此它确实定义了局部范围。在 switch 语句的大括号内声明的任何变量都不存在于大括号外。

当您进入新级别的范围时,您可以访问父范围中声明的所有内容。

你没有完全清楚你想做什么。我THINK您想要做的是拥有父类的变量,然后将来自子类的新对象放入其中,并且仍然可以访问子类的独特属性。

如果声明基类的变量,则可以将该类型的子类的任何对象分配给该变量。

如果您想访问子类的属性,则必须将变量转换为适当的类型:

UIView *control = nil;
switch (objectType)
{
  case label:  
    control = [[UILabel alloc] init];   //no error

    ((UILabel *)control).text = @"Something...";     
    break; 
  case button: 
    control = [UIButton buttonWithType: UIButtonTypeSystem];
    [((UIButton *)control) setTitle: "Foo" forState: UIControlStateNormal];
  default:
    break;
}

EDIT

我发现强制转换语法输入起来很痛苦,而且可能会让人感到困惑。有时,创建对象实际类型的新临时变量,执行您需要执行的任何操作,然后将其分配给目标变量会更清楚,如下所示:

UIView *control = nil;
switch (objectType)
{
  case label:  
    UILabel *aLabel = [[UILabel alloc] init];   //no error

    aLabel.text = @"Something...";   
    aLabel.someOtherProperty = someOtherValue;
    control = aLabel;  
    break; 
  case button: 
    UIButton aButton = [UIButton buttonWithType: UIButtonTypeSystem];
    [aButton setTitle: "Foo" forState: UIControlStateNormal];
    control = aButton
  default:
    break;
}

在 switch 语句之外,您将不知道控制变量包含哪种类型的对象,因此您只能访问 UIView 基类的属性,unless您将变量转换为特定类型,如上所示。

(请注意,上面的名称“control”是一个糟糕的选择,因为标签不是控件。最好使用“aView”之类的名称,它暗示变量中可能存在的所有对象的公共类。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Switch Case 中声明 UI 对象 的相关文章

  • 了解 React Native 中的默认字体大小

    在过去的几个月里 我一直在开发一个 React Native 应用程序 但有些事情总是让我困惑 而我现在正试图弄清楚它的真相 我正在尝试标准化应用程序中的字体大小 正文 标题等 并且正在努力了解 React Native 究竟从哪里获取默认
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • UIView 重写drawRect 导致视图不遵守maskToBounds

    我正在尝试覆盖drawRect 我的自定义视图中的 UIView 方法 但是 我的视图的边界半径定义为 sub NSBundle mainBundle loadNibNamed ProfileView owner self options
  • 在后台每 X 分钟执行一次函数不起作用

    我使用此代码每 X 分钟执行一次函数 void executeEveryOneMinute self myFunction dispatch after dispatch time DISPATCH TIME NOW int64 t 60
  • 在 iOS 8 中创建通话/双高状态栏?

    是否有调用自定义通话 双高状态栏的标准方法 如果没有 那么构建我自己的功能的最佳起点是哪里 我知道关于如何做到这一点存在一些多年的问题 但没有任何令人满意的答案 有什么新方法可以做到这一点吗 可能在 iOS 8 中 这里没有什么新鲜事 但我
  • 如何使 case 语句匹配数字范围?

    我正在运行一个列号范围为 0 50 的开关案例 现在每个案例都支持离散列号 我观察到它的失败 这是代码 i 10 a 1 b 0 65 if a b then case i in 1 2 5 echo Not OK 9 10 12 echo
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • 在 SwiftUI 中,如何执行手势但将手势转发到其后面的视图?

    我正在创建一个工具提示系统 如果用户触摸工具提示之外的任何地方 我想关闭工具提示 我希望这样在工具提示之外的触摸既可以消除工具提示 又可以激活用户点击的任何控件 因此 您可以打开一个工具提示 然后仍然单击工具提示外部的按钮 并在第一次点击时
  • NSString 到 NSDate 的转换得到错误的结果[重复]

    这个问题在这里已经有答案了 可能的重复 NSDateFormatter 的时间错误 https stackoverflow com questions 5466419 wrong time from nsdateformatter NSDa
  • 如何在 Safari 上打开本地 html 文件?

    我想打开本地 html 文件Safari集成到我的Swift 3应用 我知道如何使用网址来做到这一点 这是我用来执行此操作的代码 let encodedString url addingPercentEncoding withAllowed
  • 如何在 iOS 中设置视图的最大宽度?

    我的应用程序有一个基本的登录屏幕 一个外框以及其中的一些文本字段和按钮 我将框设置为填满屏幕 然而 在某些设备上这个盒子会太大 如何设置视图的最大宽度和高度 您可以使用自动布局约束 使框适应屏幕尺寸 但不超过给定的宽度和高度 为此 请对宽度
  • Xcode 11 无法识别静态库的架构:MacCatalyst(又名 UIKitForMac)

    在对 2019 年 WWDC 公告感到兴奋之后 我尝试使用 Xcode 11 0 beta 针对 MacOS 编译现有的 iOS 应用程序 不幸的是 事情并没有按预期进行 Xcode 说我的静态库是为 架构构建的 为 Mac 版 UIKit
  • 如何检测 iOS 8 上的包含应用程序是否启用了应用程序扩展?

    我正在 iOS 8 beta 上开发一个自定义键盘 我想告诉用户如果我的自定义键盘未启用 如何在包含应用程序中启用它 有什么方法可以检测应用程序扩展是否已启用 首先让我们设置一些常量 以便于彼此理解 包含应用程序 安装扩展并保存扩展二进制文
  • 如何将数据从一个视图传递到下一个视图?

    我正在制作一个下载排队系统来下载视频 处理下载的排队代码位于另一个视图控制器中 现在我的问题是如何将下载的 URL 传递到另一个视图而不推送到另一个视图控制器 如下所示 ViewConntroller View ViewConntrolle
  • 无法识别的选择器调用静态 iOS 库中的类别方法

    我正在使用一些第三方软件来帮助使用 Xcode 4 3 2 编写 iPad 应用程序 该软件是开源的 通常经过设置 因此其代码将与开发人员为应用程序编写的任何代码一起编译 因为我在很多地方使用该软件 所以我决定将其构建为 iOS 模拟器的静
  • iOS JPEG 图像旋转 90 度

    我正在使用选择器视图从相册中选择图像 我使用上面的代码 void imagePickerController UIImagePickerController picker didFinishPickingMediaWithInfo NSDi
  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar
  • IOS 上图像的加密/解密

    我们正在使用加密 解密和 UIIMAGE 如果我们加密和解密 UIIMAge 而不保存到 iphone 画廊中 它工作正常 但如果我们加密 保存到画廊中 将 加密的图像 加载到应用程序中 然后解密它效果不好 我们使用这个函数来加密 解密 保
  • 禁用 iPhone 4S / 新 iPad 键盘上的听写按钮

    我们的应用程序是一个医疗保健应用程序 我们的应用程序中有一个符合 HIPAA 标准的语音识别器 所有听写都可以通过它进行 医院不希望医生意外开始与不符合 HIPAA 标准的 Nuance Dragon 服务器进行对话 因此 我正在寻找可以抑
  • 在iOS中设置框架的原点

    我正在尝试以编程方式设置框架的原点 Method1 button frame origin y 100 方法二 CGRect frame button frame frame origin y 100 我尝试了方法 1 但它不起作用 显示错

随机推荐

  • 显然你可以修改 const 值而无需 UB。或者你可以吗?

    开始编辑 用户 user17732522指出调用UB的缺陷来自事实pop back 使根据使用的参考资料无效vector库文档 当发生这种情况时 不需要 constexpr 求值来检测它 因为它不是 C 核心的一部分 然而 user1773
  • Android 的“onActivityResult”机制不起作用

    我在一个简单的应用程序中遇到了一个大而令人沮丧的问题 我有两个活动 A 和 B 活动 A 通过单击按钮打开活动 B 活动 B 有两个 结束 如果用户单击 B Back 如果刚刚完成 并返回到 A 如果用户单击 B OK 按钮 则活动 B 完
  • 为什么 Python 字符串是不可变的?使用它们的最佳实践

    让Python字符串不可变的设计原因是什么 它如何让编程变得更容易 我习惯了可变字符串 比如 C 中的字符串 如果没有可变字符串 我该如何编程呢 有没有最佳实践 当您收到字符串时 您将确保它保持不变 假设您要构造一个Foo如下带有字符串参数
  • 在 Silverlight 中将 XML 动态绑定到 DataGrid

    我一直在尝试在 Silverlight 特别是 Silverlight 4 但 SL3 中的任何解决方案也可以 中将 XML 通过 XElement 动态绑定到 DataGrid 但一直无法做到这一点 我希望动态地执行此操作 即 没有严格的
  • RewriteRule 无法编译正则表达式

    我以前的服务器工作正常 今天我更换了新服务器 并且 RewriteRule 无法在我的 htaccess 上编译正则表达式 如何修复这条线 RewriteRule category 0 9 category php pid 1 catnam
  • 你可以将 UITabBarController 推入 UINavigationController 中吗

    是否无法将 UITabBarController 推入 UINavigationController 中 我在旧版本的 iOS 中读过 但现在情况仍然如此吗 简而言之 是的 你可以 但仅仅因为你可以 并不意味着你应该这样做 这UITabBa
  • Django 中的导航

    我刚刚在 django 中完成了我的第一个小 web 应用程序 我喜欢它 我即将开始将旧的 PHP 生产站点转换为 django 作为其模板的一部分 有一个导航栏 在 PHP 中 我在模板代码中根据当前 URL 检查每个导航选项的 URL
  • 按时间或运行总和进行缓冲以进行反应式扩展

    我对反应式扩展相当陌生 想要根据时间缓冲流 或者根据不超过阈值的运行总和 每个项目的大小由 lambda 指定 以先发生者为准 就像现有的Buffer按计数或时间 目前我已经编写了自己的实现Buffer方法按预期工作 使用ISchedule
  • 使用 .htaccess 附加参数

    我正在努力处理 htaccess 重写命令 我拥有的是 RewriteCond HTTP HOST www mywebsite co uk RewriteCond REQUEST URI subfolder RewriteRule subf
  • D3.js:根据值更改条的颜色[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我一直在尝试 d3 js 条形图 我想根据 y 轴的值更改颜色 如何实现这一点 我尝试添加线性渐变 但后来我失去了对它的控制 我正在编写的代码基于此 http bost ocks
  • 切片和数组有什么区别?

    为什么两者都是 u8 and u8 3 在这个例子中好吗 fn main let x u8 1u8 2 3 println x let y u8 3 1u8 2 3 println y 事实是 T n 可以强迫 T 这是让他们可以忍受的方面
  • 无法使用 PHP 执行多个 MariaDB 查询

    我在 MariaDB 中执行 SQL 查询时遇到了一个小问题 所有 PHP 变量都不为空 我想同时执行两个查询 在 MySQL 中它可以工作 但在 MariaDB 服务器中我不能 因为我收到错误 我有一个查询 UPDATE users SE
  • 如何使用vb.net表单删除MS Access数据库的记录以及如何使用vb.net表单进入受密码保护的数据库

    我是 vb net 的新手 而且还是一名学生 我创建了一个表单来在 vb net 中输入学生注册详细信息 以满足教育需求 我使用 MS Access 2010 创建了一个数据库并将其链接到我的 vb 表单 它工作正常 我可以通过 vb ne
  • C# 有 Handles 关键字吗?

    Protected Sub Menu1 MenuItemClick ByVal sender As Object ByVal e As System Web UI WebControls MenuEventArgs Handles Menu
  • 累积和的条件计数数据框 - 循环列

    我试图根据每个值的符号在数据帧内重置来计算累积和 这个想法是对每一列分别进行相同的练习 例如 假设我有以下数据框 df pd DataFrame A 1 1 1 1 1 1 1 1 1 1 1 1 B 1 1 1 1 1 1 1 1 1 1
  • Flutter(Dart):渲染引起的异常/RenderFlex溢出

    我遇到 Flutter Dart RenderFlex 像素溢出问题 渲染库的一个例外 如何管理或应用滚动功能到我的应用程序页面视图 并避免 Flutter 的渲染异常 并显示以下消息 RenderFlex 底部溢出了 28 个像素 如果您
  • 如何编写单个 LINQ to XML 查询来迭代所有子元素以及子元素的所有属性?

    我正在开发 asp net 移动应用程序 我使用 XML 作为数据库 我正在 net 中使用 LINQ to XML 查询 XML 以访问所需的元素和属性 我的 XML 文件中有以下部分
  • Vim 中 Tab 键 == 4 个空格并在大括号后自动缩进

    我该如何制作vi Vim永远不要使用制表符 将空格转换为制表符 不好 使制表符键 4 个空格 并在大括号块后自动缩进代码 例如Emacs does 另外 如何保存这些设置 这样我就不必再次输入它们 我见过与此相关的其他问题 但它似乎总是与我
  • Jmeter是否支持客户端javascript

    Jmeter是否支持客户端javascript 我能够录制脚本 但重播日志没有显示任何内容 JMeter 不是一个浏览器 它是一个负载生成工具 它可以产生 HTTP 流量 但它实际上并不解析 执行加载页面附带的 JavaScript 如果您
  • 在 Switch Case 中声明 UI 对象

    我读过有关开关盒范围的内容 跳转标签等等 但是 SO 这里建议的解决方案似乎意味着添加花括号可以避免这个问题 然而 这似乎仍然不起作用 switch objectType case label label is an integer con