【问题标题】:Retrieve custom data based on button pressed (iOS)?根据按下的按钮(iOS)检索自定义数据?
【发布时间】:2011-02-13 05:40:06
【问题描述】:

如果这是一个简单的问题,我深表歉意,但我一直无法找到足够的解决方案,我让自己有点发疯:P

我有一个应用程序,在不同的视图上有许多按钮 (40-50),并且应该根据按下的按钮构建一个包含许多条目的字典。

(例如,如果按下 Button 27,我将在 viewController 中构建一个 Dict: 姓名 -> 约翰·史密斯 地址 -> 1 无限循环 年龄 -> 99 )

显然为每个按钮编写一个特定的动作是错误的。

我想做的是将 UIButton 子类化(继续上面的示例),将名称、地址和年龄作为实例变量添加到我的自定义按钮中,并在按钮被实例化时设置每个实例变量一个初始化: 然后,当按下该按钮时,我可以有一个由所有按钮调用的 SINGLE buildDict:(id)sender 操作,并简单地用 sender.Name 等填充字典...

我的问题是:我可以在 Interface Builder 的属性检查器中添加字段来设置这些值吗?如果这不可能,我在哪里可以找到按钮实例化,以便我可以通过编程方式设置这些值?

【问题讨论】:

    标签: iphone objective-c ipad ios interface-builder


    【解决方案1】:

    您不想将属于模型的数据放在视图中。这听起来也非常复杂。
    在界面生成器中插入数据?如果我不必为我的视图编辑标签并且您想编辑其中的数据,我感到很幸运?

    说真的,做对了。创建一个 NSArray。 40 个对象对应 40 个按钮。使用 plist 编辑器创建地址列表并将该 plist 文件加载到您的代码中。这是执行此操作的最快和最干净的方法。

    给每个按钮一个标签。 (如果你必须添加 40 个按钮,我无论如何都会在代码中完成)并将它们连接到 IBAction。我建议你给第一个项目一个标签 1000。没有标签的按钮的行为就像一个标签为 0 的按钮,你不想要这个。如果你从按钮到数组索引,你不想减去 1。

    - (IBAction)buttonPressed:(UIButton *)sender {
        // remember? tag 1000 equals index 0. 
        NSUInteger index = sender.tag - 1000;
        NSDictionary *object = [self.data objectAtIndex:index];
        // do whatever you want
    }
    

    不需要子类化任何东西。无需违反模型-视图-控制器概念。

    【讨论】:

    • 我同意,这更干净,我认为我违反了 MVC。 “给每个按钮一个标签。”这是否已附加到 UIButton?我必须在子类中添加它吗? “将该 plist 文件加载到您的代码中” 我从未使用过 plist 文件。我假设这包含名称,地址等?如何在代码中加载它?最后,我想对于给出的两个答案,如何将这些按钮添加到代码中的各种视图中,而不是使用界面构建器?感谢帮助,我'
    • 标签是UIButton上已经存在的属性,所以你可以直接调用它:myButton.tag=1。您可以在我的回答中看到如何很容易地将 plist 加载到数组中,您可以在 xcode 中创建和编辑 plist 文件,它们非常易于使用,您将立即获得。
    • 非常感谢,我想这项技术将在未来为我节省大量时间,我很高兴能向这个优秀的社区学习!
    【解决方案2】:

    你可能最好使用数组和标签,但如果你真的想要子类化,你可以这样做:

    Interface Builder 不允许您添加其他属性。

    您需要使用自定义子类(用实际代码编写)来执行此操作。

    在 Xcode 上选择:

    文件-> 新建文件-> Objective C 类(UIView 的子类)。

    使用类似 MyCustomButton 的名称。

    然后您需要将(在 .h 中):UIView 替换为 :UIButton(这意味着您是 UIButton 的子类,而不是 UIView 的子类)。

    在接口声明中你可以设置你的新属性,记得将它们声明为属性以便你以后可以访问它们。

    你最终会得到如下所示的东西:

    @interface MyButton : UIButton {
        NSString* name;
        NSString* address;
        NSNumber* age;
    }
    
    @property(nonatomic,retain)NSString* name;
    @property(nonatomic,retain)NSString* address;
    @property(nonatomic,retain)NSNumber* age;
    
    @end
    

    记得@synthesize你的属性。

    要进行自定义初始化,您只需编写自己的 init 方法:

    - (id)initWith:(NSString*)aName and:(NSString*)aStreet and:(NSNumber*)anAge{
        self = [super init];
        self.name = aName;
        self.address= aStreet;
        self.age=anAge;
    
        return sef;
    }
    

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多