1

在使用 XCode 4.3.3 的简单“单一视图”测试项目中:

  1. 我将 UIView 子类化并在情节提要的 Property Inspector 中将其指定为用作 viewController 的默认视图的类。

  2. 在我的自定义 UIView 类中TestUIView,我定义了一个名为“drawSwitch”的属性。

  3. 我在我的 viewController 类中导入了我的自定义类的标题。

在尝试编译项目时,我很惊讶编译器无法使用下面的代码行识别我的子类,并给出错误:Property 'drawSwitch' not found on object of type 'UIView'。这看起来很奇怪,因为我的自定义类TestUIView被指示为 viewControllerview出口的类(如下图所示)。

[self.view setDrawSwitch:2];

然而,如果我投它,代码编译并运行良好:

[(TestUIView*) self.view setDrawSwitch:2];

当我查看 viewController 的属性时,我的自定义类被指示为 view 属性的 Outlet。

所以我对这里的故事板发生了什么感到困惑。

  • 故事板/XCode 是否让我做一些编译器不满意的事情,仅仅是一个 GUI 漏洞?

  • 我知道我可以为我的自定义视图创建一个 IBOutlet(如下所示:“testView”),但是当view插座已经定义时,创建一个额外的插座似乎是多余的。

我在这里错过了什么吗?(除了“这就是它的工作方式”之外,可能就是这种情况)。

在此处输入图像描述

4

2 回答 2

2

编译器对您在情节提要中设置的内容一无所知。它所知道的是.view你的视图控制器的属性将是一个 UIView。这很好用,因为您可以在运行时将 UIView 的任何子类分配给此属性而不会出现问题。

当您尝试使用 view 属性时,您的问题就出现了,就好像它是一个更具体的子类一样。编译器不知道,在运行时,它认为的 UIView 实际上是一个不同的类。

您的“冗余”插座实际上是 Apple 使用 UITableViewController 实现这种情况的方式。UITableViewController 有一个.view和一个.tableView属性,它们都指向同一个对象——表格视图。

另一种方法是覆盖该属性以具有不同的类,如此处和此处所讨论的但这可能会对视图控制器产生不可预见的影响。我建议坚持使用具有更具体类的单独属性 - 它肯定会使您的代码更具可读性。

题外话——这是我在 Stack Overflow 上的第 1000 个答案——不客气!

于 2012-07-29T12:25:07.740 回答
0

有些内容您可能没有发布但有误,或者可能是我没有正确理解问题。

我尝试的一个简单示例可以通过故事板进行操作,不需要演员表并且易于使用。

所以这里是 SVTView.h 的代码:

@interface SVTView : UIView{

}
-(void)sampleSet:(int)value;


@end

和 SVTView.m:

#import "SVTView.h"

@implementation SVTView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

-(void)sampleSet:(int)value{
  NSLog(@"setting value %d",value);
}


@end

最后是 ViewController 中的用法:

#import <UIKit/UIKit.h>
#import "SVTView.h"

@interface SVTViewController : UIViewController{

  IBOutlet SVTView * testView;
}

@property(nonatomic, retain) SVTView * testView;

@end

和 Viewcontroller.m:

#import "SVTViewController.h"

@interface SVTViewController ()

@end

@implementation SVTViewController

@synthesize testView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
  [testView sampleSet:2];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
  return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end

引用 Outlet 已通过 Storyboard 连接,因此使用了实例变量。日志控制台显示 disred 结果:

2012-07-28 07:51:02.227 SingleViewTest[1490:f803] setting value 2

Imo 使用正确的类并不是多余的,多余的部分可能是类转换。

于 2012-07-28T05:56:56.050 回答