2012-06-18 21 views
0

我在搜索視圖控制器中調用以下方法創建一個UIActionSheet包含兩個UISegmentedControl s(用於選擇搜索設置)中的一個按鈕。當用戶選擇第一個分段控件上的某個按鈕時,我想禁用(setEnabled:NO)第二個分段控件。問題是它不重繪(所以它永遠不會被禁用)。如果我在創建UIActionSheet時最初設置了Enable:NO,它最初是正確禁用的。UIActionSheet中的子視圖不會重繪時setEnabled調用

我試着通過調用[UIView setNeedsDisplay]強制對第二個分段控件和動作頁進行重繪,但那不起作用。

也嘗試removeFromSuperview在第二個分段控制。

這是不可能與內置的UIActionSheet?或者有更好的方式讓我顯示搜索設置?這是爲iOS5編碼的iPhone應用程序。 Popovers不適用於iPhone。我能想到的另一種方式是將設置顯示在自己的視圖中,但我想避免這種情況。

-(void)onSettingsButtonClick:(id)sender 
{ 
    // display segmented button views on actionSheet 

    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Search Settings" delegate:self cancelButtonTitle:@"Close" destructiveButtonTitle:nil otherButtonTitles:nil, nil]; 
    sheet.actionSheetStyle = UIActionSheetStyleDefault; 

    UISegmentedControl * segFullTextOrTags = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Tags", @"Full Text", @"Users", nil]]; 
    [segFullTextOrTags addTarget:self action:@selector(onSegFullTextOrTagsClicked:) forControlEvents:UIControlEventValueChanged]; 
    [segFullTextOrTags setSegmentedControlStyle:UISegmentedControlStyleBar]; 
    [segFullTextOrTags setTag:100]; 

    UISegmentedControl * segType2 = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"All Actions", @"Discussions", @"Responses", @"Comments", nil]]; 
    [segType2 addTarget:self action:@selector(onSegType2Clicked:) forControlEvents:UIControlEventValueChanged]; 
    [segType2 setSegmentedControlStyle:UISegmentedControlStyleBar]; 
    [segType2 setTag:101]; 

    [sheet showFromTabBar:self.tabBarController.tabBar]; 

    // code that expands the action sheet height and adjusts the view positions is omitted here 

    // add the additional views to the actionSheet 
    [sheet addSubview:segFullTextOrTags]; 
    [sheet addSubview:segType2]; 
} 

-(void)onSegFullTextOrTagsClicked:(id)sender 
{ 
    [self updateSettingsUI:(UIActionSheet*)sender]; 
} 

-(void)onSegType2Clicked:(id)sender 
{ 
    [self updateSettingsUI:(UIActionSheet*)sender]; 
} 

-(void)updateSettingsUI:(UIActionSheet*)actionSheet 
{ 
    UISegmentedControl * segFullTextOrTags = (UISegmentedControl*)[actionSheet viewWithTag:100]; 
    UISegmentedControl * segType2 = (UISegmentedControl*)[actionSheet viewWithTag:101]; 

    if (segFullTextOrTags.selectedSegmentIndex == 2) // users 
    { 
     // disable 2nd segmented button control 
     [segType2 setEnabled:NO]; 
    } 
    else 
    { 
     // enable 2nd segmented button control 
     [segType2 setEnabled:YES]; 
    } 

    // doesn't work... 
    [segType2 setNeedsDisplay]; 
    [actionSheet setNeedsDisplay]; 
} 

回答

1

我覺得UIActionSheet不是向用戶呈現設置視圖的正確控件。

從類參考文檔:

使用UIActionSheet類與一組 替代品如何與給定的任務繼續呈現給用戶。您還可以使用 操作表來提示用戶確認潛在危險的 操作。操作表包含一個可選標題和一個或多個按鈕,每個按鈕對應於要採取的操作。

相反,您應該創建一個UIViewController子類並以模態或導航控制器的形式呈現它。

我不知道爲什麼setEnabled不能在你的代碼中工作。 setNeedsDisplay沒有必要,控件應該重繪自己。檢查updateSettingsUI和onSettingsButtonClick中的segType2是否是同一個對象。

+0

對象不同!我簡單地通過將UISegmentedControls存儲在成員var指針中,並使用它們而不是viewWithTag來實現它。 viewWithTag:101必須返回一個新的實例。奇怪,因爲viewWithTag:100似乎工作...(segFullTextOrTags.selectedSegmentIndex == 2)在updateSettingsUI中的計算結果爲true。不管怎樣,謝謝!我還會考慮使用模態視圖控制器子類。 –

相關問題