【问题标题】:How to determine method error (Objective C/iPhone/xCode)?如何确定方法错误(Objective C/iPhone/xCode)?
【发布时间】:2011-03-11 01:37:01
【问题描述】:

在处理 Mark 和 LeMarche 提供的示例时,我遇到了许多情况无法按预期工作。例如,第 4 章讨论了用图像“增加按钮”。尽管我遵循了原始说明和一些变通方法 [1,2,3],但我似乎无法在按钮上拉伸图像。

如何确定在返回 void 的 Objective C 方法中遇到的错误? (恕我直言,一个无用的范例)。猜测罪魁祸首或错误是无用的浪费时间,而且对我来说效果不佳。

很抱歉,我很机智,我已经厌倦了所有的 printf、NSLogs 和猜测。这不是开发程序的方法。

杰夫


[1]Resizing an image with stretchableImageWithLeftCapWidth

[2]stretchableImageWithLeftCapWidth:topCapHeight doesn't work in initWithCoder: of UIImageView subclass

[3]iPhone stretchableImageWithLeftCapWidth only makes "D"s


// Source code from Mark and LeMarch ('Beginning iPhone 4 Programming', Chapter 4, pp. 99-100)
// added for completeness. The same code is presented in 'Beginning iPhone 3 Programming'.
// The button type is 'Custom', and the mode is 'Scale to Fill'. Trying to use TIFFs,
// removing Alpha channels, resizing buttons so their size is image.height+1, etc - no joy.
// The buttons were provided by Apple in their UICatalog example (http://developer.apple.com/library/ios/#samplecode/UICatalog/Introduction/Intro.html).
// I've also tried to assign the image to a single button in case the resource cannot be shared.
// Finally, no ASSERTs fire (and no exceptions are thrown), so all should be OK (yea, right).
- (void)viewDidLoad
{   
    [super viewDidLoad];

    UIImage* whiteButton = [UIImage imageNamed:@"whiteButton.png"];
    ASSERT(whiteButton != nil);

    UIImage* strechableWhiteButton = [whiteButton stretchableImageWithLeftCapWidth:12.0 topCapHeight:0.0];
    ASSERT(strechableWhiteButton != nil);

    [changeSrcFileButton setBackgroundImage:strechableWhiteButton forState:UIControlStateNormal];
    [changeDestFileButton setBackgroundImage:strechableWhiteButton forState:UIControlStateNormal];

    UIImage* blueButton = [UIImage imageNamed:@"blueButton.png"];
    ASSERT(blueButton != nil);

    UIImage* strechableBlueButton = [blueButton stretchableImageWithLeftCapWidth:12 topCapHeight:0];
    ASSERT(strechableBlueButton != nil);

    [changeSrcFileButton setBackgroundImage:strechableBlueButton forState:UIControlStateHighlighted];
    [changeDestFileButton setBackgroundImage:strechableBlueButton forState:UIControlStateHighlighted];
}

【问题讨论】:

  • 如果猜测问题对您来说是浪费时间,想象一下您甚至不显示代码对我们来说是多么困难! ;-) 我知道您可能会问的不仅仅是您给出的示例,但是为什么要三个参考?
  • 嗨 Caleb - 我对一般情况更感兴趣(即,当出现问题时如何在某处检索错误代码)。这样,我可以解决我的大部分问题,而不会浪费人们在 Stack Overflow 上的时间。杰夫
  • ASSERT(changeSrcFileButton != nil); 在哪里?
  • 嗨fluchtpunkt - 好点。它将被添加(它也是一个 IBOutlet,以防万一)。我可以告诉你,它不是零。杰夫
  • 忘记连接一些 IBOutlets 的程序员的遗言? - “我可以告诉你,它不是零”。 - 开个玩笑。但如果他们真的不是零,我可以部分理解你的咆哮。

标签: iphone objective-c ios


【解决方案1】:

您实际上是在问两个问题,我认为:“如何在按钮上拉伸图像?”和“当代码不起作用时你会怎么做?”我先拿前者。以下代码适用于我从头开始创建一个带有拉伸图像的按钮:

UIImage *image = [[UIImage imageNamed:@"ButtonPic"] stretchableImageWithLeftCapWidth:19 topCapHeight:19];
CGRect frame = CGRectMake(80, 200, 160, 40);
UIButton *button = [[UIButton alloc] initWithFrame:frame];
[button setBackgroundImage:image forState:UIControlStateNormal];
[self.view addSubview:button];
[button release];

您自然需要提供合适的图片。我的图像是在 Photoshop 中创建的 80x40 像素的 PNG 图像,拉伸到上方 160 像素的宽度。这是它的样子:

我看不出我的代码与 the code in the book 之间有任何显着差异。看起来书中的按钮是从笔尖加载的,而不是通过编程方式创建的,但我和他们都调用 -stretchableImageWithleftCapWidth:topCapHeight: 和 -setBackgroundImage:forState: 来完成相关工作。

这就引出了第二个问题:“当代码不起作用时,你会怎么做?”

这里没有一个单一的答案,但首先要做的是尽可能缩小问题范围。 Arthur Conan Doyle 写道:“一旦你消除了不可能的事情,剩下的无论多么不可能,都必须是事实。” 在像这样的案例中,你只有几行代码,一种简单的方法是通过将有问题的代码复制到新项目中来隔离有问题的代码。根据视图模板创建一个新的 iOS 项目只需要一点时间,您可以将上面的代码粘贴到提供的视图控制器的 -viewDidLoad 方法中进行尝试。然后,您需要做的就是提供图像。如果它仍然不起作用,则您已从怀疑中删除了应用程序中的所有其他代码。如果它确实有效,您可以从您的应用程序中逐渐添加更多代码,以尝试重现问题并确定原因。将代码移至测试项目并不总是可行的,但您通常可以找到简化问题的方法。

就错误而言,请记住,即使每个函数和方法都成功,代码也经常会失败。问题不在于组件,而在于它们的组合方式。

【讨论】:

  • 嗨 Caleb - “这里没有一个单一的答案,但首先要做的就是尽可能缩小问题范围”。在 Windows 中,我检查一个 BOOL。如果结果为假,我会打电话给GetLastError。在 Linux 中,我检查一个 INT。如果结果errno。世界上“最先进的操作系统”(根据 Apple 的文献)提供什么方法​​来检查函数调用/方法的结果?我能说的最好的,我唯一能做的就是等着看小部件是否正确绘制。如果它没有正确绘制,我必须 grep Stack Overdlow 寻找正确的旋钮来转动。杰夫
  • 嗨 Caleb - “这里没有一个单一的答案,但首先要做的就是尽可能缩小问题范围”。我不是想打败一匹死马,但必须只有一个答案。如果没有,程序如何判断存在错误,以及程序如何确定不能进一步处理的不可恢复状态?很抱歉打败了一匹死马(我对此有点兴奋)。杰夫
  • 我已尽我所能回答了您最初提出的问题,现在很抱歉,我花费了我所做的时间来回答看起来更像是咆哮而不是真正的问题。从 errno 到 NSError 再到 NSException,各种 API 级别的错误报告机制都有很好的文档记录,如果您是认真地询问,我邀请您访问文档。另外,请随时发布您的代码——我相信有人会在一两分钟内发现您的错误。
  • “我现在很抱歉,我花时间来回答看起来更像是咆哮而不是真正的问题” - 请不要有这种感觉。我是该平台的新手(但我在其他平台上有相当多的时间),并且我认为有一种方法可以在运行时检测错误和异常情况。显然,我的假设是错误的(否则,您会告诉我“调用函数 XXX”)。我责怪 Apple 的执行不力和功能缺失。感谢您的时间。杰夫
  • 很抱歉因为某个问题的特定实例分散了您的注意力 - 我对“在运行时检测错误和异常情况”的一般解决方案感兴趣。杰夫
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2011-02-15
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多