1

当我从 .NET 过渡到 Objective-C 时,我正在学习控件和事件处理的基础知识。

我使用 ARC 和 Storyboard 在 XCode 4.2 中创建了一个单一视图项目。在 Storyboard 上,ViewController 有一个 UIImageView 和一个 UIButton。UIImageView 在 Identity Inspector 的“标签”条目中被分配了名称“imgLock”。使用相同的技术将按钮命名为“btnToggle”。

视图控制器.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
  IBOutlet UIButton *btnToggle;
  IBOutlet UIImageView *imgLock;
}

- (IBAction) toggleImage;

@property (readonly, strong) UIButton *btnToggle;
@property (readwrite, strong) UIImageView *imgLock;
@end

视图控制器.m

#import "ViewController.h"

@implementation ViewController
@synthesize btnToggle, imgLock;

BOOL imgState;

- (void) toggleImage {
    UIImage *img = [UIImage imageNamed: imgState ? @"Unlocked64" : @"Locked64"];
    imgState = !imgState;
    [imgLock setImage: img];
}

在情节提要上,我按住 Ctrl 键将蓝线从按钮拖到图像上,然后toggleImage从生成的上下文菜单中进行选择。

当我在项目中放置一个断点toggleImage并构建/运行项目时,我看到一切都正常,除了imgLock0x0。从我的 Windows 时代开始,我想我期待控件被实例化,因为它们被“放置在表单上”。

日志没有注释,除了杀死进程时的警告:警告:函数“void”中“/SourceCache/gdb/gdb-1708/src/gdb/macosx/macosx-nat-i​​nferior.c”的第2184行错误macosx_kill_inferior_safe()"

4

1 回答 1

2

在 Storyboard 上,我按住 Ctrl 键将蓝线从按钮拖到图像上,然后从生成的上下文菜单中选择 toggleImage。

我不完全确定你在这里做了什么,但你需要在你的 ViewController 对象和每个按钮和图像之间拖动那条线。按住“控制”并从代表您的视图控制器的图标拖动到按钮,然后选择btnToggle. 再次按住“控制”并从视图控制器拖动到图像,这次选择imgLock.

接下来,您需要确保您的按钮已连接到目标和操作。动作是点击按钮时将发送的消息,目标指示该动作消息将发送到的对象。要设置这些,从按钮控制拖动到您的视图控制器(因为您希望视图控制器成为目标)。toggleImage:从弹出的列表中选择您的方法以将其选为操作。

从我的 Windows 时代开始,我想我期待控件被实例化,因为它们被“放置在表单上”。

当您在情节提要中创建它们时,您基本上是在实例化它们。就像 .xib 文件一样,情节提要文件包含序列化对象。当您从情节提要加载视图控制器及其关联视图时,这些对象将“反序列化”回您可以使用的对象。您的视图控制器的出口是对故事板中其他对象的引用;这些引用将与对象一起创建,但您必须在情节提要中将它们连接起来。

于 2012-03-05T07:54:47.797 回答