2011-06-14 81 views
1

我有一個UISplitViewController實用程序類型的應用程序,其中每個UIViewController處理各種計算。我有一個彈出式分段控件,允許用戶設置某些選項。我的問題是保存和重新加載的UITextfields內容和所選擇的段的索引時,如果段控制索引被保存並且是== 1作爲狀態從當加載selectedindex時,UISegmentedControl觸發ValueChanged

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    theDepthSegment.selectedSegmentIndex = [[defaults objectForKey:@"updateMe"] intValue]; 
設置ValueChanged事件從 viewdidload發射了

有沒有辦法阻止valuechanged被激發,因爲所選段被設置爲視圖執行加載?也許好歹來確定觸摸事件,而碼之差

這似乎很奇怪發生這種情況,也許有另一種方式....

謝謝

回答

2

考慮的觀點只是加載,分段控制沒有先前的值,所以它會認爲它確實正在改變並且相應地起作用。有一種方法可以解決這個問題,即在與分段控件關聯的IBAction方法中設置一個BOOL值。在你的viewDidLoad方法開始時,比如wasLoaded = NO(其中wasLoaded需要在頭文件中聲明)。然後你會分配你的selectedSegmentIndex。之後,申報wasLoaded = YES。最後,在你的IBAction方法,這樣說

if (wasLoaded) { 
    // do what you need to do since this isn't when it's being initialized 
} 
1

得到這個工作的最快方法是脫離在Interface Builder中IBAction,你改變viewDidLoad值後添加addTarget:action:forControlEvents:方法。沒有辦法區分觸摸觸發的更改和UIControlEventValueChanged的編程更改。您可以查看觸控事件,但它與更改的值不同。

0

Deepak是對的。如果您沒有使用Interface Builder來設置您的UISegmentedControl,則應首先設置UISegmentedControl的選定索引,然後致電addTarget:action:forControlEvents:。像這樣:

  NSArray *items = [[NSArray alloc] initWithObjects:@"A", @"B", nil]; 
      UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:items]; 
      [items release]; 
      [segmentedControl setFrame:CGRectMake(10, 10, 300, 46.0f)]; 
      [segmentedControl setTag:60]; 
      [segmentedControl setSelectedSegmentIndex:savedSelectedIndex]; 
      [segmentedControl addTarget:self action:@selector(segControlClicked:) forControlEvents:UIControlEventValueChanged]; 
      [self.view addSubview:segmentedControl]; 
      [segmentedControl release]; 
相關問題