![](/img/trans.png)
[英]How do I access and modify properties of other objects while in viewDidLoad?
[英]If I add a control programmatically in viewDidLoad, how do I access it from other methods?
在我的主View Controller的viewDidLoad方法中,以编程方式创建一个分段控件,然后将其添加到导航控件的titleView中。
NSArray *seggieItems = [[NSArray alloc] initWithObjects:@"See Entire List",@"See Near Me", nil];
UISegmentedControl *seggie = [[UISegmentedControl alloc]initWithItems:seggieItems];
[seggie setSegmentedControlStyle:UISegmentedControlStyleBar];
[seggie setTintColor:[UIColor redColor]];
[seggie addTarget:self
action:@selector(seggieChanged:)
forControlEvents:UIControlEventValueChanged];
self.navigationItem.titleView = seggie;
但是,当我想从其他方法(例如viewWillAppear)访问此分段控件时,我不能-它是未声明的标识符。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[seggie setSelectedSegmentIndex:0]; //this should always be 0 for this view controller viewDidLoad method
}
如果我使用的是XIB,那将没有问题,因为我有一个IBOutlet,可以在任何地方使用。 我尝试为我的Segmented控件创建一个属性,但是实例变量隐藏了局部变量,因此这一定是错误的方法。
最好的方法是什么? 如果这是一个愚蠢的问题,我深表歉意-我对iOS还是相当陌生,目前大约在阅读几本书。 我在Google或搜索StackOverflow上找不到答案。 我将不胜感激,如果能提供的帮助确实很简单,我很抱歉。 谢谢
使其成为属性是正确的方法。 如果这样做,并得到描述的掩码警告,则可能仍在viewDidLoad方法中声明seggie变量。 删除该声明,并始终引用self.seggie
而不是seggie
,就可以了。
通过声明,我的意思是这一行:
UISegmentedControl *seggie = [[UISegmentedControl alloc]initWithItems:seggieItems];
它应该是
self.seggie = [[UISegmentedControl alloc]initWithItems:seggieItems];
有两种方法可以做到这一点:
1>在.h文件(全局)中为UISegmentedControl声明对象,并且同一类都不需要属性,除非您希望从其他类进行访问。
2>您可以遍历父视图的子视图并获取UISegmentedControl并将其类型转换为perfrom OPerations,例如:
NSArray *subviewss=[self.view subviews];
for(int i=0;i<[subviewss ;i++])
{
if([[subviews objectAtIndex:i] isKindOfClass:[UISegmentedControl class]])
{
UISegmentedControl *segmentControl= (UISegmentedControl *) [subviewss objectAtIndex:i];
[segmentControl setSelectedSegmentIndex:0];
}
}
但是上面的循环代码只有在您的viewcontroller中只有一个分段控件作为子视图时才会起作用,否则它将陷入UISegmentedControl类类型的任何事物中。
把这个UISegmentedControl *seggie;
.h(header)文件中的代码行,或将其设置为Global!
您不能以其他方法使用本地创建的对象。 局部变量和即时变量。它适用于Java,但我希望您能理解主要思想。
上面的建议选项是好的,可以创建属性,也可以创建类范围/全局变量。 还有一种方法,如果您不想定义属性或类范围/全局变量,
访问控制,例如-
for (int index = 0; index < [self.view.subviews count]; index++) {
if([[self.view.subviews objectAtIndex:index] isKindOfClass:[UISegmentedControl class]]) {
UISegmentedControl *seggie = (UISegmentedControl *) [self.view.subviews objectAtIndex:index];
[seggie setSelectedSegmentIndex:0];
}
}
并不是真正的评论,而是一些一般性建议
是的,这确实是获取视图的最无效的方法。
首先,如果您使用快速枚举,则至少可以避免重复使用
[self.view.subviews objectAtIndex:index]
电话,这真的
[[[self view] subviews] objectAtIndex:index]
方法分配很快,但这并不意味着您不应该考虑代码实际在做什么。
您的代码不考虑多个控件,因为它们都被视为相同(例如,设置为0)。
找到所要查找的对象后,也不会从此循环中提前退出。 如果您坚持要在景观中循环浏览,至少要做得很好-
for (UISegmentedControl *seggie in [self.views.subviews]) {
if ([seggie isKindOfClass:[UISegmentedControl class]]) {
seggie.selectedSegmentIndex = 0;
break;
}
}
你要么做一个财产
UISegmentedControll *seggie
在头文件中,或将数组设为全局。
如果那不是您的选择,我将尝试使用
UISegmentedControl * temp = self.navigationController.titleView;
[temp setSelectedSegmentIndex:0];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.