是的,这是我在教程中花费数小时之前遇到的关键问题之一。我不认为这对于刚刚涉足应用程序开发的经验丰富的程序员来说没有很好的记录。
通常的方法是在相关视图控制器类(A子类或分别)UIButton
的 .h 文件中声明对象类型的属性(即。 )。添加关键字是关键。UIViewController
UITableViewController
IBOutlet
该关键字使 Interface Builder(IB;现在是您的故事板编辑器)能够识别那些应该链接到在 IB 中创建和维护的 UI 项的属性。您可以通过从连接检查器(IB 视图中的右侧窗格,窗格选项卡栏上最右侧的图标,圆圈中带有箭头的那个)拖动一条线到预览中的实际对象(中心窗格)或在视图层次视图中。
在 .h 文件中(以及在 .m 文件中,如果您在那里合成它)您的连接由声明左侧圆圈中的一个点确认。当属性未连接时,它是一个空圆圈。当属性未标记为 时,根本没有圆圈IBOutlet
。
现在,当您从视图控制器内部(或没有 - 可能但不推荐)访问该属性时,在大多数方法(viewDidLoad 和 follwonig 方法)中,它应该与 nil 不同。您可以获取或设置值,通过设置它们,您将实际更改屏幕上相关的 UI 项。
很多 UI 项都是控件(例如 UIControl 的子类,UIButton)并分配了动作。通过调用一个动作,控件将消息发送给它的控制器,用户做了一些感兴趣的事情。用户可能更改了 UISwitch 的值或按下了 UIButton。这与属性非常相似。声明一个方法。不再需要在 .h 中这样做,但我仍然遵循这种模式。开始输入- (IBAction) someName
,自动完成将引导您完成。您可以将(IBAction)
其视为同义词(void)
,但它告诉 xcode IDE 这应该作为操作链接到控件。IBAction 接收一个类型为 (id) 或 (UIView) 或 (UIControl) 的参数。(我不太确定实际类型)。关键是它接收到对执行操作的控制实例的引用 - 发送者。典型模式:
-(IBAction) myButtonWasPressed:(UIButton *)sender;
您可以撰写有关在此阶段将其键入到 UIButton 是否明智的书籍。但是,它可以工作,但您应该在方法中进行测试并确保它确实是一个UIButton
(例如,通过使用isKindOfClass:[UIButton class]
),然后再访问 UIButtons 独有的任何属性或方法。如果您只是对调用的 IBAction 做出反应并且根本不访问发件人,那么您可能会忽略发件人甚至省略参数。我认为以下内容也应该起作用:-(IBAction) myButtonWasPressed;
当然,您需要在 .m 文件中实现该方法。
您可以通过在 IB 中拖动一条线,以与属性类似的方式将此操作链接到控件。如果是按钮,您将被要求将其分配给事件。对于按钮,touchUpInside
事件不是一个糟糕的选择。如果您发现自己有理由这样做,您可以对许多事件执行相同的操作。(想不出任何理由,但效果很好)。