簡體   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