1

我有一个带有标签栏控制器的 mainwindow.xib。第一个标签栏有一个视图,从“View1.xib”加载。在我的 View1.xib 中,我将 UI 元素拖到上面。它在.h中有这个:

#import <UIKit/UIKit.h>
@class View1Controller;


@interface View1Controller : UIViewController {
    IBOutlet UIView *view;
    IBOutlet UIButton *startButton;
}

@property (retain, nonatomic) UIView *view;
@property (retain, nonatomic) UIButton *startButton;


-(IBAction)startClock:(id)sender;

@end

在 .m 文件中,我什么也不做。它会正常运行。我可以看到视图及其按钮。但是在我添加之后:

@synthesize view, startButton;

当我加载应用程序时,它显示一个没有按钮但没有产生错误的空白视图。怎么了?

4

2 回答 2

2

基本问题是UIViewController已经有了一个view属性。当您在UIViewController子类中重新定义它时,您会覆盖该视图属性。坦率地说,我很惊讶它甚至可以编译。

修理:

(1) 首先,问问自己除了继承的视图属性之外是否还需要另一个视图属性。如果您只需要控制器的一个视图,只需使用继承的属性。

(2) 如果您确实需要对第二个视图的引用,请将其命名为:

#import <UIKit/UIKit.h>
//@class View1Controller; <-- don't forward declare a class in its own header


@interface View1Controller : UIViewController {
    // IBOutlet UIView *view; <-- this is inherited from UIViewController
    IBOutlet UIView *myView;
    IBOutlet UIButton *startButton;
}
//@property (retain, nonatomic) UIView *view; <-- this is inherited from UIViewController
@property (retain, nonatomic) UIView *myView;
@property (retain, nonatomic) UIButton *startButton;


-(IBAction)startClock:(id)sender;

@end

然后在实现中:

//@synthesize view; <-- this is inherited from UIViewController
@synthesize myView, startButton;
于 2010-03-02T15:41:37.307 回答
1

问题是您将变量viewstartButton变量声明为 IBOutlets。这意味着 Interface Builder 直接从 XIB 文件绑定这些变量。

您定义的属性不是 IBOutlets。当您合成它们时,您会覆盖 getter/setter,并且 Interface Builder 无法再绑定到它们。

要解决您的问题,请从您的成员变量中删除 IBOutlet 说明符并将您的属性声明更改为以下内容:

@property (retain, nonatomic) IBOutlet UIView *view;
@property (retain, nonatomic) IBOutlet UIButton *startButton;
于 2010-03-02T14:47:21.320 回答