我是 Objective-C 的新手,可以使用一些帮助来解决让我难过的问题。我称之为消失变量的问题。我将尝试在下面描述它。
我正在尝试创建自己的标签栏控制器和视图,因为我已经得出结论UITabBarController
并且UITabBar
不允许我做我需要做的事情(我需要彻底改变标签栏的外观)。
我已经对UIViewController
和进行了子类化,分别UIView
创建了我的类SYTabBarController
和SYTabBar
。
在SYTabBar
中,我编写了一种以编程方式将UIButton
s 添加到视图中的方法:
- (UIButton*) addButtonWithFrame:(CGRect)frame action:(SEL)action target:(id)target imageToken:(NSString*)imageToken
{
UIButton *b = [[UIButton alloc]initWithFrame:frame];
[b addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
UIImage
*unselectedImage = [UIImage imageNamed:APPEND_STRING(@"TBI+Unselected+", @"imageToken")],
*selectedImage = [UIImage imageNamed:APPEND_STRING(@"TBI+Selected+", @"imageToken")],
*selectedBgImage = [UIImage imageNamed:@"TBI+SelectedBG"];
[b setImage:unselectedImage forState:UIControlStateNormal];
[b setImage:selectedImage forState:UIControlStateHighlighted];
[b setImage:selectedImage forState:UIControlStateSelected];
[b setBackgroundImage:selectedBgImage forState:UIControlStateHighlighted];
[b setBackgroundImage:selectedBgImage forState:UIControlStateSelected];
[b setShowsTouchWhenHighlighted:NO];
[b setAdjustsImageWhenHighlighted:NO];
[b setAdjustsImageWhenDisabled:NO];
[self addSubview:b];
return b;
}
我调用这个方法SYTabBarController
来创建五个按钮:
UIButton *button1 = [self.tabBar addButtonWithFrame:CGRectMake(0, 0, 64, 45)
action:@selector(changeView:)
target:self
imageToken:@"Popular"];
UIButton *button2 = [self.tabBar addButtonWithFrame:CGRectMake(64, 0, 64, 45)
action:@selector(changeView:)
target:self
imageToken:@"Feed"];
UIButton *button3 = [self.tabBar addButtonWithFrame:CGRectMake(64*2, 0, 64, 45)
action:@selector(changeView:)
target:self
imageToken:@"Capture"];
UIButton *button4 = [self.tabBar addButtonWithFrame:CGRectMake(64*3, 0, 64, 45)
action:@selector(changeView:)
target:self
imageToken:@"Likes"];
UIButton *button5 = [self.tabBar addButtonWithFrame:CGRectMake(64*4, 0, 64, 45)
action:@selector(changeView:)
target:self
imageToken:@"Profile"];
然后,仍然在 中SYTabBarController
,我尝试获取这五个按钮并将它们作为键添加到存储为属性的字典中(参见下面的代码)。字典包含UIViewController
键控到按钮的实例。这个想法是,当五个按钮之一被按下时,它将调用选择器changeView:
,这反过来将从UIViewController
字典中检索相应的实例并显示其视图。
self.viewControllersKeyedToButtons = [NSDictionary dictionaryWithObjectsAndKeys:
rootViewController,
button1,
[[SYViewController_Feed alloc] init],
button2,
[[SYViewController_Capture alloc] init],
button3,
[[SYViewController_Likes alloc] init],
button4,
[[SYViewController_Profile alloc] init],
button5,
nil];
当我初始化字典时,我的代码就崩溃了。我收到此错误消息:
2012-12-27 02:54:28.498 Smuvy[17931:c07]-[UIButton copyWithZone:]:无法识别的选择器发送到实例 0x717fc10 2012-12-27 02:54:28.500 Smuvy[17931:c07] * 终止应用程序未捕获的异常'NSInvalidArgumentException',原因是: ' - [UIButton的copyWithZone:]:无法识别的选择发送到实例0x717fc10' *第一掷调用堆栈:(0x174c012 0x1223e7e 0x17d74bd 0x173bbbc 0x173b94e 0x17ce714 0x1712b55 0x172d5a8 0x65d6 0x2c6e 0x1687b7 0x168da7 0x169fab 0x17b315 0x17c24b 0x16dcf8 0x3676df9 0x3676ad0 0x16c1bf5 0x16c1962 0x16f2bb6 0x16f1f44 0x16f1e1b 0x1697da 0x16b65c 0x2aad 0x29d5) libc++abi.dylib:终止调用抛出异常 (lldb)
现在这里是奥秘。当我在调试器中跟踪变量button5
时,我注意到就在我尝试实例化字典之前,它消失了!难怪我收到一条错误消息。
由于我是 Objective-C(和 C)的新手,所以我对内存管理知之甚少,我想我的变量做错了什么。我已经运行了 Instruments,有趣的是,我看到所有UIButton
实例都活得很好。因此,按钮似乎在那里,只是指针不知何故消失了。
您可以提供的任何帮助将不胜感激。