我有以下代码用于添加一些
UIBarButton
到我的项目中。这在以下情况下都能正常工作:iOS 7.1上的所有设备:
- 模拟器 iPhone Retina 3.5 英寸;
- 模拟器 iPhone Retina 4 英寸;
- 模拟器 iPhone Retina 4 英寸 (64 位);
- iPhone 4;
- iPhone 4s。
但我没有 iPhone 5 设备进行测试。
在新的 iPhone 5s 上无法正常工作,有何不同?
以下是代码:
-(void)setupNavigationBar
{
self.saveSearchButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.saveSearchButton setImage:[UIImage imageNamed:@"Save Search"] forState:UIControlStateNormal];
[self.saveSearchButton setImage:[UIImage imageNamed:@"Save Search Active"] forState:UIControlStateHighlighted|UIControlStateSelected];
[self.saveSearchButton addTarget:self action:@selector(saveSearchButtonpressed)forControlEvents:UIControlEventTouchUpInside];
[self.saveSearchButton setFrame:CGRectMake(0, 0, 23, 31)];
self.changeLayutButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.changeLayutButton setImage:[UIImage imageNamed:@"View List"] forState:UIControlStateNormal];
[self.changeLayutButton setImage:[UIImage imageNamed:@"View Grid"] forState:UIControlStateHighlighted|UIControlStateSelected];
[self.changeLayutButton addTarget:self action:@selector(changeViewLayoutButtonPressed)forControlEvents:UIControlEventTouchUpInside];
[self.changeLayutButton setFrame:CGRectMake(0, 0, 23, 31)];
self.sortByButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.sortByButton setImage:[UIImage imageNamed:@"Sort By"] forState:UIControlStateNormal];
[self.sortByButton setImage:[UIImage imageNamed:@"Sort By Active"] forState:UIControlStateHighlighted|UIControlStateSelected];
[self.sortByButton addTarget:self action:@selector(sortByButtonPressed)forControlEvents:UIControlEventTouchUpInside];
[self.sortByButton setFrame:CGRectMake(0, 0, 23, 31)];
UIBarButtonItem *fixedItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
fixedItem.width = 20;
UIBarButtonItem *saveSearchButton = [[UIBarButtonItem alloc] initWithCustomView:self.saveSearchButton];
UIBarButtonItem *changeViewButton = [[UIBarButtonItem alloc] initWithCustomView:self.changeLayutButton];
UIBarButtonItem *sortByButton = [[UIBarButtonItem alloc] initWithCustomView:self.sortByButton];
NSArray *barbuttonitems = @[sortByButton, fixedItem, changeViewButton, fixedItem,saveSearchButton];
self.navigationItem.rightBarButtonItems = barbuttonitems;
self.lastLayoutUsed = [[NSUserDefaults standardUserDefaults]objectForKey:@"LastLayoutUsed"];
if ([self.lastLayoutUsed isEqualToString:@"GridLayout"]){
self.changeLayutButton.selected = YES;
[NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(highlightButton:) userInfo:self.changeLayutButton repeats:NO];
}
}
我已经逐行检查过代码,所有属性都不为nil,并且具有有效值。我也检查了所有图像的大小是否正确。
为什么模拟器上每个设备都能正常工作,而实际的 iPhone 5S 却不能?
此外,由于 iPhone 4S 和 5S 两部手机具有完全相同的屏幕宽度和 iOS 版本,我真的很困惑?
按钮根本没有显示出来。没有编译器警告和控制台错误。
更新
在 iPhone 5 上测试了上述代码,它完美地工作了。这使我相信它必须与 iPhone 5S 的64位版本有关?
更新2
从该方法中删除了所有代码,并将其更改为像这样的一个非常简单的按钮:
self.saveSearchButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.saveSearchButton setTitle:@"Save" forState:UIControlStateNormal];
[self.saveSearchButton setTintColor:[UIColor blueColor]];
UIBarButtonItem *saveSearchButton = [[UIBarButtonItem alloc] initWithCustomView:self.saveSearchButton];
self.navigationItem.rightBarButtonItem = saveSearchButton;
现在这个问题在任何设备或模拟器上都无法运行。
我在这里做错了什么?
更新3 - 解决方案!
好吧,原来只是一个简单的问题引起了这么多麻烦。我的UIButtons被声明为weak
而不是strong
- 我曾经认为UI元素需要是弱的,因为它们经常离开视图?
我在评论区得到了帮助,找到了这个解决方案。
这也不能解释为什么在iPhone 4S和iPhone 5上声明为weak
时它仍然有效。在64位模拟器上声明为weak
也可以正常工作。
这是否意味着必须使用64位模拟器作为指南,并且在实际测试中必须进行测试,因为似乎模拟器在UIKit
测试方面并不准确?
我很想更多地了解这个问题。