我一直致力于通用iOS应用程序的前端,将单独的iPhone和iPad视图控制器设置为无XIB视图控制器的子类(如http://www.kotancode.com/2011/04/05/ios-universal-apps/中所述)。每个子类视图控制器都包含一个特定于设备的XIB,每个XIB包含纵向和横向UIViews,这些UIViews在方向改变时切换(为此我遵循http://aseriesoftubes.com/articles/ipad-development-101-orientation/)。所有四个UIView共有的控件与通过IBOutletCollections链接的IBAction方法同步。
就在今天,我为自己的滑块设计创建了一个UISlider子类,除了一个大问题外,它似乎工作得很好:当在模拟器中使用iPhone从纵向开始测试时,滑块工作正常;当切换到风景时它也很好;然而,当我切换回肖像时,滑块最多可以进行两次操作,然后冻结,用它来对视图进行一些其他控制;陌生人,如果我切换回横向滑块工作正常!这只发生在iPhone模拟器上,而不是iPad上。
我尝试打开和关闭IB的'连续'选项,并尝试从我的滑块发送事件中的'Touch Up Inside'和'Value Changed'连接,没有任何变化(因为它将用于音量控制I将需要'价值改变'来工作)。我的滑块的实现代码是:
@implementation VolumeSlider
- (id)initWithCoder:(NSCoder *)decoder
{
if((self = [super initWithCoder: decoder])) // Double paretheses to silence warning
{
// Instantiate slider images
UIImage *thumbImage = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"volume thumb" ofType: @"png"]];
UIImage *trackImage = [[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"volume track" ofType: @"png"]] stretchableImageWithLeftCapWidth: 20 topCapHeight: 0];
// Set control elements with images
[self setThumbImage: thumbImage forState: UIControlStateNormal];
[self setMinimumTrackImage: trackImage forState: UIControlStateNormal];
[self setMaximumTrackImage: trackImage forState: UIControlStateNormal];
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
@end
滑块触发的两种操作方法是:
- (IBAction)volumeChange:(id)sender
{
NSLog(@"VOLUME slider changing");
// VOLUME slider action
}
- (IBAction)volumeChangeFinish:(id)sender
{
NSLog(@"VOLUME change finished");
VolumeSlider *incomingVolume = sender;
for(VolumeSlider *volumeSlider in self.volumeSliders)
{
volumeSlider.value = incomingVolume.value;
}
}
(volumeChange将使用滑块值实时更改音量,volumeChangeFinished将在内部触摸时更新视图中的其他滑块。)
这个让我感到难过 - 这感觉就像一个记忆问题,但我无法确切地知道在哪里。有没有人知道可能导致这种情况的原因?
(Mac OS 10.6.8,Xcode 4.0.2,适用于iOS 4.3)
更新---
我已经尝试将一个新的,库存UISlider实例化到iPhone视图中,这也遇到了同样的问题,没有连接任何东西。这指向视图控制器的问题,甚至是一些错误。
答案 0 :(得分:0)
虽然我没有明确的理由解决这个问题,但我设法解决了这个问题。基本上我在Interface Builder中为iPhone纵向创建了一个新的UIView,重建了界面并将其连接起来代替了狡猾的界面,问题就消失了。我不知道我是否可以在XIB中看到损坏的视图,这是我能提供的唯一答案。