我有一些困扰我的琐碎问题。当我使用“基于窗口的应用程序”创建新项目时,例如。对于iPhone,我宣布了它的app委托,然后例如我想创建一个额外的UIViewController / nib对并将其添加到主窗口视图中作为“进入点视图”的一种 - 我试图避免强制执行主应用程序委托成为“视图”的地方,并保持委托代码清洁视图人员。
这也困扰我,我只是不想使用“基于视图的应用程序”作为开始模板,对于学习,对于商品,我希望能够理解问题并找到解决方案。
问题如下:
所以主应用代理( TestProjectAppDelegate.m )看起来像:
#import "TestProjectAppDelegate.h"
#import "TestView.h"
...
- (BOOL)application:(UIApplication *)application .....
{
TestView *vc = [[TestView alloc] initWithNibName:@"TestView" bundle:nil];
[window addSubview:vc.view];
[vc release];
[window makeKeyAndVisible];
return YES;
}
到目前为止一切看起来都不错,,,现在我想在TestView中找到一个按钮,我将它添加到IB中,在标题中声明常用的propreties,并将IBAction和IBOutlet与drag方法链接起来。现在 TestView.h 变成了:
@interface TestView: UIViewController {
UIButton *myButton;
}
@property (nonatomic, retain) IBOutlet UIButton *myButton;
- (IBAction) youPressedMe:(id)sender;
@end
..和 TestView.m 有点常见......(与youPressedMe一起)实现......
#import "TestView.h"
@implementation TestView
@synthesize myButton;
-(void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"TestView loaded ...");
//the title changes ok!
[myButton setTitle:@"Press me now!" forState:UIControlStateNormal];
}
-(IBAction)youPressedMe:(id)sender
{
NSLog(@"You really pressed me!");
}
...
// other standard code inserted by template
...
-(void)dealloc
{
[myButton release];
[super dealloc];
}
@end
好的,所以问题就出现了。我肯定已经加载并成功初始化了TestView,因为在应用程序启动时,其笔尖(在IB中)上绘制的按钮正确显示。我甚至可以将按钮标题更改为其他内容(在运行时)。这表明通过“myButton”对它的引用是正确链接的。此外, youPressedMe 方法,当我按下按钮时,从未调用过。当我按下按钮时,我收到错误并且应用程序崩溃。错误显示发送到实例的未知选择器...的方式如下:
-[NSCFString youPressedMe:]: unrecognized selector sent to instance 0x6d23730
2010-10-20 20:04:09.293 TestProject[4295:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString youPressedMe:]: unrecognized selector sent to instance 0x6d23730' .....
我检查了1000次,并且已经设置并正确链接了按钮的IBAction(对于它的所有者,即TestView nib)。现在,当以“基于视图”模板作为起点进行相同的示例时,以类似的方式,一切都会立即生效......
答案 0 :(得分:1)
此处发布的代码是处理视图及其控制器时常见陷阱的示例。 addSubview保留VIEW但不保留它所属的CONTROLLER。此外,有各种控制器方法将控制器传递给它作为参数,有时由于使用的相似性而使人感到困惑。解决方案非常简单。使vc成为一个合成的proprety,并让app委托dealloc释放它,在这个例子中使用它作为局部范围变量是不够的,它需要足够活动,以便视图控制器(在需要时)可以处理用户输入 - 在这个exaple按钮按
干杯