การทำให้ 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