1

在我的主视图控制器的 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。我尝试为我的分段控件创建一个属性,但是实例变量隐藏了局部变量,所以这一定是错误的方法。

解决这个问题的最佳方法是什么?如果这是一个愚蠢的问题,我深表歉意——我对 iOS 还很陌生,目前大约读了几本书。我在 Google 或搜索 StackOverflow 上找不到答案。我会很感激任何帮助,如果这是我错过的非常简单的事情,我很抱歉。谢谢

4

5 回答 5

3

将其作为属性是正确的方法。如果你这样做,并得到你描述的掩码警告,你可能仍在你的 viewDidLoad 方法中声明 seggie 变量。删除该声明并始终引用self.seggie而不是,seggie你会没事的。

通过声明,我的意思是这一行:

UISegmentedControl *seggie = [[UISegmentedControl alloc]initWithItems:seggieItems];    

它应该是

self.seggie = [[UISegmentedControl alloc]initWithItems:seggieItems];
于 2012-05-12T08:03:17.630 回答
3

有两种方法可以做到这一点:-

1>要么在 .h 文件(全局)中声明 UISegmentedControl 的对象,除非您想从其他类访问,否则同一类不需要属性。

2>您可以遍历父视图的子视图并获取 UISegmentedControl 并将其类型转换为执行 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];

}
}

但是只有当您的视图控制器中只有一个分段控件作为子视图时,上面的循环代码才会起作用,否则它会碰到任何类类型为 UISegmentedControl 的东西。

于 2012-05-12T11:14:47.040 回答
2

将这UISegmentedControl *seggie;行代码放在您的 .h(header) 文件中,或者将其设为 Global !

您不能在其他方法中使用本地创建的对象。本地和即时变量。它适用于 java,但我希望你能理解主要思想。

于 2012-05-12T07:59:08.523 回答
2

上面的建议选项很好,创建一个属性或类范围/全局变量。另一种方法,如果您不想定义属性或类范围/全局变量 -

访问控制,如 -

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; 
    } 
}
于 2012-05-12T08:16:42.080 回答
1

你要么做一个财产

UISegmentedControll *seggie

在你的头文件中,或使数组全局。

如果这不是你的选择,我会尝试使用

UISegmentedControl * temp = self.navigationController.titleView;
[temp setSelectedSegmentIndex:0];
于 2012-05-12T08:06:15.507 回答