![](/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.