【问题标题】:ios: creating own viewios:创建自己的视图
【发布时间】:2011-03-14 16:24:50
【问题描述】:

我才刚刚开始开发 iOS 应用程序。所以我猜这个问题会是nooby..

我正在尝试了解 mvc 模型在 iOS 开发中的工作原理。

我想混合可用的视图和我自己的视图(我想使用诸如绘制字符串之类的图元自己绘制)

所以

我创建了 MyView:UIView 类。然后我重写了 drawRect 方法并在那里添加了一个简单的输出。然后我使用界面生成器将我的课程添加到“ipad 显示器”。

问题是 DrawRect 方法开始处的断点永远不会到达。当然,我在模拟器中得到一个空白屏幕=(

我尝试添加 ViewController 并在界面构建器中使用它,但实际上我不需要它,因为我的视图只是绘制一个常量字符串,仅此而已......

我想我误解了一些非常严重的事情,因为查看苹果示例对我没有任何帮助。

这是我的代码(抱歉,忘记了):

MyView.h:

@interface MyView : UIView {
...
}

MyView.m:

...
- (void)drawRect:(CGRect)rect {

    NSString *text = @"Hello, world";

    UIFont *font = [UIFont systemFontOfSize:10];

    [[UIColor blackColor] set];
    CGPoint point;
    point = CGPointMake(0.5f, 0.5f);
    [text drawAtPoint:point withFont:font];

    [font release];
}

更新:

我添加了一个 TabBar 只是为了确保问题仅出在我自己的观点上。就是这样:TabBar 出现了。

【问题讨论】:

  • 发布代码会更容易发现错误。
  • 您在 MainWindow.xib 中是否有与您的窗口关联的视图对象?如果是这样,请确保此视图对象的类是 MyView。我想要了解的是,您的应用程序在启动时正在从 nib 文件创建视图,并且您希望确保正在创建的视图属于 MyView 类型。

标签: iphone ios ipad uiview view


【解决方案1】:

由于您没有发布代码,这是一个疯狂的猜测,但您需要重新渲染视图:

[myViewInstance setNeedsDisplay:YES];

此外,请确保视图已实际加载。您可以在 nib 唤醒方法 (-[<NSNibAwaking> awakeFromNib]) 中使用一点 NSLog 来检查这一点。

【讨论】:

  • 我应该在哪里做(重新渲染我的视图)?
  • 事实上,我什至无法理解谁创建了视图。也许它隐藏在笔尖中,但这只是一个猜测......
  • “创建视图”是指分配内存和初始化。
  • 如果drawRect: 从未被调用,那么问题就不是setNeedsDisplay:-drawRect: 在您第一次出现在屏幕上时至少会被调用一次。
【解决方案2】:

如果drawRect: 没有被调用,那么要么你实际上不在屏幕上,要么你为drawRect: 输入了错误的签名。正确的签名是:

- (void)drawRect:(CGRect)rect

为确保您确实在屏幕上,请尝试重载 awakeFromNib 并在此处设置断点。如果不是,那么您没有在界面生成器中正确配置它。最常见的问题是未能为视图设置正确的类(应设置为 MyView),或者将其放入未实际加载的 NIB。

当然,请确保您实际上是 UIView 的子类,您没有收到来自编译器或 Interface Builder 的任何警告,并且在您运行时没有打印到控制台的消息。

【讨论】:

  • 看起来我的签名是正确的(老实说 - 我刚刚取消了 stub= 的注释))顺便说一句,我怎样才能覆盖一个方法而不必担心打错字?为此,我转到基类实现(通过 option-double_click)并从那里复制。看起来有更好的方法,不是吗?这是我的第一次 xcode(和 mac)体验 - 抱歉...
  • Xcode 3 中最好的方法是从头文件中复制。 Xcode 4 在自动完成签名方面做得更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2012-09-02
  • 1970-01-01
  • 2012-03-08
  • 2011-07-22
  • 2012-06-15
相关资源
最近更新 更多