【问题标题】:How to display an image using UIView in XCode?如何在 XCode 中使用 UIView 显示图像?
【发布时间】:2012-01-26 15:29:32
【问题描述】:

绝对是初学者的问题。我正在尝试制作一个应用程序,该应用程序将通过侧向滑动屏幕来切换一组图像。所以,作为一个普通的例子,我试图首先显示一个图像,然后考虑如何使用一个动作在图像之间切换。我正在使用 XCode 4.2。

所以,这就是我目前所拥有的。我在故事板中添加了一个 UIImageView,然后 Ctrl+拖动到“.h”文件中以创建一个 Outlet,它看起来像这样:

SwitchViewController.h

#import <UIKit/UIKit.h>

@interface SwitchViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIImageView *imageView;


@end

然后在“.m”文件中,我尝试在 DidLoad 方法中为 UIImageView 设置图像。

SwitchViewController.m

#import "SwitchViewController.h"

@implementation SwitchViewController
@synthesize imageView;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIImage *plate1 = [UIImage imageNamed:@"plates1.tif"];
    [imageView setImage:plate1];
}

- (void)viewDidUnload
{
    [self setImageView:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ((interfaceOrientation == UIInterfaceOrientationLandscapeRight) ||

        (interfaceOrientation == UIInterfaceOrientationLandscapeLeft))

        return YES;



    return NO;
}

@end

现在,如果我尝试运行它,则不会出现编译错误。
但程序停止说,线程 1:程序收到信号“SIGABRT”

【问题讨论】:

  • 可能抛出异常。你能告诉我们Xcode控制台上的输出吗?
  • IBOutlet 是否连接到 .xib 中的UIImageView?你也应该使用[self.imageView setImage:plate1];
  • 非常感谢,@mattjgalloway。控制台是这样的。 2012-01-26 22:04:40.728 Switch-a-Switch[548:f803] *** 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[ setValue:forUndefinedKey:]:这个类是不符合键 UIImageView 的键值编码。'
  • @basvk:谢谢。我确实将 Outlet 从情节提要拖到了界面上。抱歉,我对 XCode 和 Objective C 非常陌生。我可以看到 .storyboard 文件,但找不到 .xib 文件。我将 [imageView.setImage:plate1] 更改为 [self.imageView.setImage:plate1]
  • @AshinMandal 查看我的答案 - 您正在尝试设置名为 UIImageView 的键。您一定是在 IB 中弄错了链接。

标签: objective-c ios5 uiimageview xcode4.2


【解决方案1】:

参考您的实际问题,您会抛出此异常:

2012-01-26 22:04:40.728 Switch-a-Switch[548:f803] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<SwitchViewController 0x6840660> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key UIImageView.'

您似乎已将UIImageView 连接到名为UIImageView 而不是imageView 的属性。在 Interface Builder 中重做连接,确保从 imageView 属性拖动到 UIImageView 实例。

【讨论】:

  • 从属性选项卡中,我从对象列表中拖动了图像视图对象。它创建了一个蓝色的矩形,上面写着 UIImageView。我从那个矩形拖动我的插座。字面的描述是为了确保我在做正确的事情。 (:
  • 是的,听起来你做对了,但如果你仍然抛出异常,那么你做错了什么。您应该右键单击文件所有者并从imageView 右侧的圆圈拖动到您放置在视图上的UIImageView
  • 嘿。我找不到文件所有者。所以,我所做的就是清理一切。故事板和控制器。然后尝试构建一次只是为了检查我不会再次收到错误。然后再次添加了一个 Image View,删除了一个 Outlet,再次编写了 viewDidLoad 方法。它奏效了。非常感谢! (:
【解决方案2】:
UIImage *plate1 = [UIImage imageNamed:@"plates1.tif"];
[imageView setImage:plate1]; 

在 iOS 和 64 位(非脆弱的 ABI 环境,因为 iVar 将被合成)中应该是犹太洁食,我认为在界面中包含 ivar 是更好的形式......

@interface SwitchViewController : UIViewController
{
    UIImageView *imageView;
}

您应该做的事情是打开僵尸并启用异常断点。

【讨论】:

  • 我很抱歉,但到目前为止我所有的编码(无论我做了什么)都是用 Java 完成的。所以我创建对象的实例并将它们作为参数传递。习惯指针对我来说需要一点时间。你说的在interface中包含ivar,是不是我在“.m”文件中创建了一个interface block,然后在那里合成?
  • no sorry iVar,是接口中声明的实例变量。
  • 这是在 iPhone 和 64 位英特尔运行时的幕后为您完成的......但无论如何您仍应指定,至少在您了解其工作原理之前。
【解决方案3】:

那里有一些东西。 (现在我只学习自己,所以可能是错的,但这里是)

当您使用 @property 时,您应该使用 self.imageView 设置器来分配给它。所以 [imageView setImage:plate1] 会变成 self.imageView.image = plate1。并将其从弱更改为保留在.h中。并在 viewdidunload 中执行 self.imageView = nil。我也认为您在这里尝试实现的图像滑动效果可能更适合水平滚动视图。你可以打开分页或其他东西。 希望对您有所帮助,并没有向您发送完全错误的方向:P

【讨论】:

  • 不要将其更改为保留。 Weak 在这里非常好,因为您应该让父 UIView 为您保留 ImageView。 Weak 确保如果父级离开,它将为零。因此,您实际上不需要在卸载时将其设置为 nil。
  • 在访问 imageview 上的属性时不需要使用“self”,只有在设置 imageview 属性本身时才需要。 IE。 [imageView setImage:anImage] 可以,或者self.imageView = anImageView
  • @glogic:谢谢。所以,我确实接受了您的建议,将 [imageView setImage:plate1] 更改为 self.imageView.image = plate1 但没有任何改变。我仍然得到那个“SIGABRT”的东西并且构建停止了,iOSSimulator 只是黑色的。
  • 啊,是的,西蒙。没错,我没有想到那里(+1)。我首先将其设置为 self.imageview = plate1 但后来看到 plate1 是图像而不是另一个 imageview 并进行了快速编辑,将 .image 添加到它。 ashin 忽略我所说的完全错误的所有内容:P 我能看到的唯一会阻止它编译的是情节提要中的 imageView 未正确附加到 .h 中的 iboutlet 。当您转到情节提要并右键单击视图控制器场景列表左侧的 uiimageview 名称时。它说它附在什么名字上?它说 imageView 是它的名字吗?
  • 当我右键单击它时,它显示引用 Outlets: imageView.
【解决方案4】:

我认为您可能以错误的方式处理此问题。如果您想侧滑以在图像之间移动,您应该使用启用分页的 UIScrollView。一个快速的谷歌想出了this

希望有帮助

【讨论】:

  • 我确实想在图像之间切换,但不是滑动动画,我希望图像变形为下一个。将有两组图片,一组重叠在另一组上。如果我水平滑动,下面的图片应该会改变,上面的图片应该打开垂直滑动。这种滑动可以在屏幕上的任何地方进行。
  • 好吧——在这种情况下,您将不得不研究 CoreAnimation。您应该能够更改 alpha 值,这将使图像“变形”到彼此。您可以使用 UISwipeGestureRecognizer 调用动画。希望对您有所帮助。
  • 当然。只要我能够通过 UIImageView 显示图像,我就会尝试这样做。 (:
猜你喜欢
  • 1970-01-01
  • 2019-06-09
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多