Membuat UIButton mengubah gambar UIImageView

Saya sangat baru dalam pemrograman dan objektif c, jadi tolong santai saja.

Saya ingin UIButton (yang saya gunakan sebagai IBAction) untuk mengubah gambar di UIImageView saat ditekan. Saya memasukkan UIImageView ke dalam UIScrollView di storyboard tetapi saya harap saya masih dapat mengubah gambar secara terprogram.

Saya telah mencari jawaban ke mana-mana selama berjam-jam tetapi tidak ada yang berhasil bagi saya karena itu bukan solusi yang tepat atau saya tidak melakukannya dengan benar.

Saya telah mencoba kode ini dan kode lainnya tetapi mereka selalu mengembalikan "Thread 1: signal SIGABRT" ketika saya menekan tombol:

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

Ini kode saya sejauh ini:

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

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

Bantuan akan sangat dihargai. Saya muak dengan itu. Saya mungkin telah melakukan kesalahan konyol di suatu tempat tetapi saya tidak dapat menyelesaikannya. Terima kasih sebelumnya.


person Invalid Memory    schedule 30.04.2013    source sumber


Jawaban (1)


Petunjuk umum:

  1. Coba gunakan @property untuk semua variabel instan Anda (ini akan melayani Anda dengan baik di masa mendatang)
  2. Jangan gunakan @synthesize (kompiler melakukan tugasnya dengan lebih baik untuk Anda)
  3. Jika Anda memiliki properti bob, akseslah dengan menggunakan self.bob
  4. Aktifkan ARC (sepertinya Anda belum mengaktifkannya saat ini)
  5. Sebaiknya tidak ada spasi pada nama gambar

Agar lebih jelas mengenai properti, bila Anda memiliki properti, Anda tidak perlu membuat variabel instan di antara {} dari @interface. Ini harus dihapus untuk mencegah definisi ganda. Sintesis otomatis yang dilakukan oleh kompiler akan menentukan variabel instan untuk Anda, tetapi Anda harus selalu menggunakan properti untuk mengakses nilainya (seperti pada item 3 di atas).

Meskipun demikian, - (IBAction)switchUnit:(id)sender Anda terlihat baik-baik saja, jika sedikit kosong. Kodenya harus seperti:

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

Agar dapat berfungsi, gambar Ruler_pic_inch.png harus ada dalam bundel Anda (yang berarti ada dalam proyek Xcode dan disetel untuk disalin selama pembuatan.

Sekali lagi, meskipun demikian, masalah Anda sepertinya berhubungan dengan kebingungan Anda di suatu tempat. Masalah tipe SIGABRT biasanya diambil oleh kompiler dan diberitahukan kepada Anda sebagai peringatan yang mengatakan sesuatu seperti "beberapa objek mungkin tidak merespons beberapa pemilih". Jika Anda melihat salah satu dari hal tersebut, lihatlah dan cari tahu mengapa Anda mencoba menanyakan pertanyaan yang tidak dipahami objek tersebut.

Jika Anda tidak melihat peringatan kompiler apa pun, maka Anda telah memberi tahu kompiler bahwa suatu objek akan bertipe satu dan kemudian menyetelnya ke tipe lain. Dalam hal ini saya akan melihat IBOutlets Anda di Storyboard dan memeriksa apakah IBOutlets benar-benar disetel ke tampilan tujuan yang benar (putuskan sambungan dan sambungkan kembali semuanya untuk memastikan).

person Wain    schedule 30.04.2013
comment
Terima kasih banyak! Saya dengan hati-hati memeriksa jawaban Anda dan berhasil membuatnya berfungsi dengan melakukan saran terakhir Anda untuk menghubungkan kembali IBOutlets. Saya suka situs web ini. Namun mengenai tidak adanya spasi pada nama gambar. Saya melakukan apa yang Anda sarankan tetapi hanya memberikan gambar hitam namun setelah mengganti garis bawah dengan spasi, itu berfungsi dengan baik. Terima kasih telah menjelaskan kesalahan SIGABRT karena saya pernah mengalami beberapa kesalahan sebelumnya dan membuat saya bingung. - person Invalid Memory; 01.05.2013
comment
Satu pertanyaan, bolehkah memiliki masalah semantik saat tidak mensintesis properti? Terima kasih - person Invalid Memory; 01.05.2013
comment
Itu tergantung apa yang Xcode katakan tentang masalah semantiknya. Secara umum, peringatan apa pun adalah masalah yang harus diselesaikan. - person Wain; 01.05.2013
comment
Inilah yang dikatakan dalam masalah semantik: Properti 'bannerIsVisible' yang disintesis otomatis akan menggunakan variabel instan yang disintesis '_bannerIsVisible', bukan variabel instan yang ada 'bannerIsVisible' dan dikatakan demikian untuk semua yang belum saya sintesis. - person Invalid Memory; 01.05.2013
comment
Saya menambahkan lebih banyak lagi pada jawabannya. Pada dasarnya, hapus variabel instan yang propertinya Anda miliki dan pastikan Anda menggunakan 'mandiri'. Untuk mengaksesnya. - person Wain; 01.05.2013
comment
Saya mengerti sekarang, terima kasih banyak atas bantuan Anda. Anda tidak tahu berapa banyak waktu dan frustrasi yang telah Anda selamatkan dari saya! Anda telah sangat membantu. - person Invalid Memory; 01.05.2013