项目从“基于窗口的应用程序”启动时添加视图

时间:2010-10-20 17:58:25

标签: iphone cocoa-touch

我有一些困扰我的琐碎问题。当我使用“基于窗口的应用程序”创建新项目时,例如。对于iPhone,我宣布了它的app委托,然后例如我想创建一个额外的UIViewController / nib对并将其添加到主窗口视图中作为“进入点视图”的一种 - 我试图避免强制执行主应用程序委托成为“视图”的地方,并保持委托代码清洁视图人员。

这也困扰我,我只是不想使用“基于视图的应用程序”作为开始模板,对于学习,对于商品,我希望能够理解问题并找到解决方案。

问题如下:

  1. 我创建了一个新项目,例如TestProject作为基于窗口的应用程序
  2. 我现在有一个众所周知的入口点menthod的TestProjectAppDelegate.m ....
  3. 我创建了一个新的UIViewController子类,其中包含相应的nib。 TestView
  4. 我将TestView添加到主窗口视图中,一切正常,视图加载并显示重叠主窗口视图,这是正常的...
  5. 所以主应用代理( 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)。现在,当以“基于视图”模板作为起点进行相同的示例时,以类似的方式,一切都会立即生效......

1 个答案:

答案 0 :(得分:1)

此处发布的代码是处理视图及其控制器时常见陷阱的示例。 addSubview保留VIEW但不保留它所属的CONTROLLER。此外,有各种控制器方法将控制器传递给它作为参数,有时由于使用的相似性而使人感到困惑。解决方案非常简单。使vc成为一个合成的proprety,并让app委托dealloc释放它,在这个例子中使用它作为局部范围变量是不够的,它需要足够活动,以便视图控制器(在需要时)可以处理用户输入 - 在这个exaple按钮按

干杯