2012-11-26 50 views
0

我正在尝试更改IB中UISegmentedControl的文本。这是代码更改UISegmentedControl文本

[changeButton removeAllSegments]; 
[changeButton insertSegmentWithTitle:NSLocalizedString(@"Traffic",@"traffic string") atIndex:0 animated:YES]; 
[changeButton insertSegmentWithTitle:NSLocalizedString(@"Satellite",@"satellite string") atIndex:1 animated:YES]; 

但没有任何反应:我总是看到默认的标签IB为我放置(“第一”和“第二”)。 可以肯定,我把IBOutlet中在我的.h:

__weak IBOutlet UISegmentedControl *changeButton; 

我缺少什么?一般来说,当我在IB中创建控件时,为了以编程方式访问它,将IBOutlet放入.h中是正确的方法吗?

+0

您正在混合属性和ivars。是changeButton属性? – Fogmeister

+0

@Fogmeister我不认为OP有什么属性声明,如果它是弱财产或弱变量,在这里并不重要。 – 2012-11-26 09:35:17

+0

但是,如果他连接属性changeButton并尝试访问ivar changeButton,那么确实很重要。它们不是同一件事。他将需要访问ivar _changeButton(或self.changeButton)。 – Fogmeister

回答

0

解决。 问题是我在init方法中写了上面的指令。相反,他们应该进入viewDidLoad方法!

1
__weak 

哦,等等......如果它很弱,它会在作用域结束时解除分配和清零(当创建它的方法返回时)。省略__weak,它应该没问题。

+0

不起作用。我删除__weak ...,结果是一样的。 – giuseppe

+0

@giuseppe我会保留这个答案作为参考谁实际犯了这个错误。除了将代码从'init'移动到'viewDidLoad'外,我所建议的做法也是必要的。顺便说一下,如果您使用代码创建UI元素(而不是使用IB),则可以安全地在'init'中更改它们的属性。 – 2012-11-26 10:06:40

0

这只与设置属性和名为changeButton的伊娃尔有关。从OP中不清楚,所以把这个放在这里以防万一。

看起来你是混合属性和ivars。

changeButton ivar不属性changeButton。

删除线...

__weak IBOutlet UISegmentedControl *changeButton; 

从.H

,并更改代码...

[_changeButton removeAllSegments]; 
[_changeButton insertSegmentWithTitle:NSLocalizedString(@"Traffic",@"traffic string") atIndex:0 animated:YES]; 
[_changeButton insertSegmentWithTitle:NSLocalizedString(@"Satellite",@"satellite string") atIndex:1 animated:YES]; 
+0

我不明白:如果我把“if(changeButton.selectedSegmentIndex == 0)”,我可以访问changeButton。为什么我应该使用_changeButton? – giuseppe

+0

就像我说的,只有当你为changeButton设置了一个属性和一个ivar时,这才是相关的。可以发送消息到零,所以changeButton。即使changeButton为零,selectSegmentIndex也可以工作。设置一个断点(或NSLog)来检查changeButton是否为零。 – Fogmeister

+0

是的,它是零。为什么?在我的.h我只有“IBOutlet UISegmentedControl * changeButton;”。没有其他定义。无论如何,如果我删除行__weak,构建失败,没有对_changeButton的引用。 – giuseppe