Objective-C中的动态出口

时间:2012-01-28 21:34:55

标签: objective-c cocoa-touch

我刚开始学习Objective-C / Cocoa Touch。我正在开发一个允许动态创建视图的应用程序(为了这个问题,我们假设单击某个按钮会导致按钮和标签被添加到当前视图中)

因此,当用户点击此“创建按钮”时,新的按钮和标签将添加到当前视图中。当用户点击新创建的按钮时,我希望新创建的标签中的文本更改为。现在我知道我可以在运行时创建它时为按钮分配一个IBAction,但我不确定如何将新标签与Outlet相关联。

此外,我想用尽可能少的代码来做这件事,但我不知道这是怎么回事。 AFAIK是我能真正识别视图中控件的唯一方法是它们的tag属性并不完全有用所以我将有一个事件处理程序,最终看起来像这样(伪代码):

switch(tag)
{
   case 1:
   //label1.text = @"foo";
   break;

   case 2: 
   //label2.text = @"foo";
   break;
   //etc
}

在C#中我可以做类似的事情(假设e是CommandEventArgs,所有按钮都连接到这个事件,而CommandName包含我们想要更新的标签的id):

  Label lbl = (Label)panel1.FindControl(e.CommandName);
  lbl.Text = "foo";

所以我的问题是

  • 是否可以在运行时分配/创建Outlet并将它们与给定标签相关联
  • 除了使用开关之外,还有更好的方法可以确定应该对哪个标签采取行动吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

IBOutlets的目的通常是让您将Interface Builder中创建的内容与代码中的实例变量相关联。由于您在代码中创建视图以开始,听起来您应该只是在实例变量中存储对它们的引用而不必担心IBOutlets。

答案 1 :(得分:0)

如果你有:

UILabel *localVariableForLabel = ...some label just created...

并且您希望将其存储到插座'instanceVariableForLabel',您可以使用键值编码。所以:

[targetObject setValue:localVariableForLabel forKey:@"instanceVariableForLabel"];

或传递任何其他NSString。这正是Cocoa在加载NIB时所做的事情,也是您的网点需要符合键值编码的原因。

我不清楚你在创建一个新的插座时究竟是什么意思,但是如果你想将标签放在某处并稍后通过名称访问它,NSDictionary可能就是你所期待的对