Заставить UIButton изменить изображение UIImageView

Я очень новичок в программировании и объективном C, поэтому, пожалуйста, будьте со мной полегче.

Я хотел бы, чтобы UIButton (который я использую как IBAction) менял изображение в UIImageView при нажатии. Я поместил UIImageView в UIScrollView в раскадровке, но надеюсь, что смогу программно изменить изображение.

Я часами искал ответ абсолютно везде, но у меня ничего не получалось либо потому, что это было неправильное решение, либо я не сделал это должным образом.

Я пробовал этот код и некоторые другие, но они всегда возвращают «Поток 1: сигнал SIGABRT», когда я нажимаю кнопку:

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

Вот мой код:

ViewController.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

ViewController.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

Помощь будет принята с благодарностью. Я сыт по горло этим. Я, наверное, где-то сделал глупую ошибку, но я не могу это исправить. Заранее спасибо.


person Invalid Memory    schedule 30.04.2013    source источник


Ответы (1)


Общие указатели:

  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 обычно обнаруживаются компилятором и сообщаются вам в виде предупреждения, говорящего что-то вроде «какой-то объект может не отвечать на какой-то селектор». Если вы видите что-то из этого, посмотрите на них и выясните, почему вы пытаетесь задать объекту вопрос, который он не понимает.

Если вы не видите никаких предупреждений компилятора, значит, вы сказали компилятору, что объект будет одного типа, а затем фактически установили для него что-то другое. В этом случае я бы посмотрел на ваши IBOutlets в раскадровке и убедился, что они действительно настроены на правильное представление назначения (отключите и снова подключите их все, чтобы быть уверенным).

person Wain    schedule 30.04.2013
comment
Большое спасибо! Я тщательно просмотрел ваш ответ и сумел заставить его работать, выполнив ваше последнее предложение о повторном подключении IBOutlets. Мне нравится этот сайт. Однако относительно отсутствия пробелов в именах изображений. Я сделал то, что вы предложили, но он просто дал черное изображение, однако после замены подчеркивания пробелами все заработало правильно. Спасибо за объяснение ошибки SIGABRT, потому что у меня уже было несколько таких ошибок, и они меня сбили с толку. - person Invalid Memory; 01.05.2013
comment
Один вопрос: нормально ли иметь семантическую проблему, когда не синтезируются свойства? Спасибо - person Invalid Memory; 01.05.2013
comment
Это зависит от того, что Xcode говорит о семантической проблеме. Вообще говоря, любое предупреждение — это проблема, которую необходимо решить. - person Wain; 01.05.2013
comment
Вот что говорит семантическая проблема: автоматически синтезированное свойство «bannerIsVisible» будет использовать синтезированную переменную экземпляра «_bannerIsVisible», а не существующую переменную экземпляра «bannerIsVisible», и оно говорит это для всего, что я не синтезировал. - person Invalid Memory; 01.05.2013
comment
Я добавил еще немного к ответу. По сути, удалите переменные экземпляра, для которых у вас есть свойства, и убедитесь, что вы используете «я». Чтобы получить к ним доступ. - person Wain; 01.05.2013
comment
Теперь понял, большое спасибо за помощь. Вы не представляете, сколько времени и нервов вы мне сэкономили! Вы очень помогли. - person Invalid Memory; 01.05.2013