繁体   English   中英

如果我以编程方式在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM