0

我对编程和目标 c 非常陌生,所以请放轻松。

我想要一个 UIButton(我用作 IBAction)在按下时更改 UIImageView 中的图像。我将 UIImageView 放入情节提要中的 UIScrollView 中,但我希望我仍然可以以编程方式更改图像。

我已经在任何地方搜索了几个小时的答案,但没有任何东西对我有用,因为它不是正确的解决方案,或者我没有正确执行。

我已经尝试过这段代码以及更多代码,但是当我按下按钮时它们总是返回“线程 1:信号 SIGABRT”:

imageView.image = [UIImage imageNamed: @"Ruler pic inch.png"];

到目前为止,这是我的代码:

视图控制器.h

#import <UIKit/UIKit.h>
#import <iAd/iAd.h>

@interface ViewController : UIViewController <ADBannerViewDelegate, UIScrollViewDelegate>      {

ADBannerView *adView;
BOOL bannerIsVisible;
IBOutlet UIScrollView *scrollView;
IBOutlet UIImageView *imageView;
IBOutlet UIButton *proVersion;
IBOutlet UIButton *howToUse;

}

- (IBAction)switchUnit:(id)sender;

@property (nonatomic, assign) BOOL bannerIsVisible;
@property (nonatomic, retain) IBOutlet UIScrollView *scrollView;
@property (nonatomic, retain) IBOutlet UIImageView *imageView;

@end

视图控制器.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize bannerIsVisible;
@synthesize scrollView;
@synthesize imageView;


- (void)viewDidLoad
{
[super viewDidLoad];

// Hide status bar:
[[UIApplication sharedApplication] setStatusBarHidden:YES];

// iAd:
adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
adView.frame = CGRectOffset(adView.frame, 0, -50.0f);
[self.view addSubview:adView];
adView.delegate=self;
self.bannerIsVisible=NO;

// Setting scrollview content size to size of image
scrollView.contentSize = CGSizeMake(320,2246);

}

-(void)bannerViewDidLoadAd:(ADBannerView *)banner
{
if (!self.bannerIsVisible) {

    [UIView beginAnimations:@"animateAdBannerOn" context:NULL];
    banner.frame = CGRectOffset(banner.frame, 0, 50.0f);
    [UIView commitAnimations];
    self.bannerIsVisible = YES;

    }
}

-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
if (self.bannerIsVisible) {

    [UIView beginAnimations:@"animateAdBannerOff" context:NULL];
    banner.frame = CGRectOffset(banner.frame, 0, -50.0f);
    [UIView commitAnimations];
    self.bannerIsVisible = NO;

    }
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}


- (IBAction)switchUnit:(id)sender {

// CODE THAT MAKES IMAGE CHANGE GOES HERE (I thought...)

}

@end

帮助将不胜感激。我受够了。我可能在某个地方犯了一个愚蠢的错误,但我无法解决。提前致谢。

4

1 回答 1

2

一般指针:

  1. 尝试使用@property您的所有实例变量(它会在未来很好地为您服务)
  2. 不要使用@synthesize(编译器为您做得更好)
  3. 如果您有一个属性bob,请使用self.bob
  4. 打开 ARC(看起来你目前没有打开它)
  5. 最好不要在图像名称中包含任何空格

要明确属性,当您拥有属性时,您不需要在 @interface 的 {} 之间创建实例变量。这些应该被删除以防止多个定义。编译器完成的自动综合将为您定义实例变量,但您应该始终使用该属性来访问该值(如上面的第 3 项)。

也就是说,你- (IBAction)switchUnit:(id)sender看起来不错,如果有点空。代码应该是这样的:

self.imageView.image = [UIImage imageNamed:@"Ruler_pic_inch.png"];

为了让它工作,图像Ruler_pic_inch.png需要在你的包中(这意味着它在 Xcode 项目中并设置为在构建期间复制。

同样,也就是说,您的问题似乎与您在某个地方感到困惑有关。SIGABRT 类型问题通常会被编译器拾取并作为警告通知您,例如“某些对象可能无法响应某些选择器”。如果您看到其中任何一个,请查看它们并弄清楚您为什么要尝试向对象询问它不理解的问题。

如果您没有看到任何编译器警告,那么您已经告诉编译器一个对象将属于一种类型,然后实际上将其设置为其他类型。在这种情况下,我会在 Storyboard 中查看您的 IBOutlets 并检查它们是否实际设置为正确的目标视图(确保断开并重新连接它们)。

于 2013-04-30T20:07:18.840 回答