草庐IT

iphone - 如何判断方法错误(Objective C/iPhone/xCode)?

coder 2024-01-22 原文

在处理 Mark 和 LeMarche 提供的示例时,我遇到了很多情况,其中事情没有按预期工作。例如,第 4 章讨论了带有图像的“Spiffing up a button”。我似乎无法在按钮上拉伸(stretch)图像,尽管事实上我遵循了原始说明和一些解决方法 [1,2,3]。

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

抱歉,我的脾气暴躁 - 我已经无能为力了,我已经厌倦了所有的 printf、NSLog 和猜测。这不是开发程序的方法。

杰夫


[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];
}

最佳答案

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

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 px PNG 图像,拉伸(stretch)到上面 160 px 的宽度。这是它的样子:

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

这让我们想到了第二个问题:“当代码不起作用时你会怎么做?”

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

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

关于iphone - 如何判断方法错误(Objective C/iPhone/xCode)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5268057/

有关iphone - 如何判断方法错误(Objective C/iPhone/xCode)?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  6. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  7. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  8. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  9. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  10. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

随机推荐