2010-10-13 19 views

Répondre

7

Ajout UISegmentedControls (ou UISwitches, que je recommande personnellement pour un simple on/off en option) est assez facile à mettre dans les cellules de vue de table en utilisant la propriété accessoryView.

Votre contrôleur de vue (ou tout autre objet que vous utilisez pour contrôler cette chose) doit implémenter le protocole UITableViewDataSource.

@interface MyViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> {} 
@end 

Ajouter les contrôles tableView: cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString* const SwitchCellID = @"SwitchCell"; 
    UITableViewCell* aCell = [tableView dequeueReusableCellWithIdentifier:SwitchCellID]; 
    if(aCell == nil) { 
     aCell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SwitchCellID] autorelease]; 
     aCell.textLabel.text = [NSString stringWithFormat:@"Option %d", [indexPath row] + 1]; 
     aCell.selectionStyle = UITableViewCellSelectionStyleNone; 
     UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero]; 
     aCell.accessoryView = switchView; 
     [switchView setOn:YES animated:NO]; 
     [switchView addTarget:self action:@selector(soundSwitched:) forControlEvents:UIControlEventValueChanged]; 
     [switchView release]; 
    } 

    return aCell; 
} 

Ou, si vous définissez sur les contrôles segmentés, remplacer les choses UISwitch ci-dessus avec quelque chose comme:

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"On", @"Off", nil]]; 
    segmentedControl.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
    segmentedControl.segmentedControlStyle = UISegmentedControlStylePlain; 
    segmentedControl.frame = CGRectMake(75, 5, 130, 30); 
    segmentedControl.selectedSegmentIndex = 0; 
    [segmentedControl addTarget:self action:@selector(controlSwitched:) forControlEvents:UIControlEventValueChanged]; 
    aCell.accessoryView = segmentedControl; 
    [segmentedControl release];  

I mettrait personnellement ces options dans une vue régulière (probablement accessible à partir d'un bouton d'options qui fait la transition flip, comme de nombreuses applications iPhone le font). Je ne pense pas que le mettre dans une vue alerte est une très bonne expérience utilisateur.

Cependant, j'ai écrit quelques articles de blog montrant comment mettre diverses vues dans les vues d'alerte (text field, qui est plutôt utile, et web view, qui est discutablement pas).

Donc, si vous êtes vraiment mort ensemble à mettre cela en une vue d'alerte, vous pouvez tout à fait faire, comme ceci:

- (void) doAlertWithListView { 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Preferences" 
                message:@"\n\n\n\n\n\n\n" 
                delegate:self 
              cancelButtonTitle:@"Cancel" 
              otherButtonTitles:@"OK", nil]; 

    UITableView *myView = [[[UITableView alloc] initWithFrame:CGRectMake(10, 40, 264, 150) 
                 style:UITableViewStyleGrouped] autorelease]; 
    myView.delegate = self; 
    myView.dataSource = self; 
    myView.backgroundColor = [UIColor clearColor]; 
    [alert addSubview:myView]; 

    [alert show]; 
    [alert release];  
} 

Il ressemblera à quelque chose comme ceci:

UIAlertView with a UITableView

+0

Merci pasternack !! Je vais essayer ... et laissez-vous savoir. Merci encore...!! – rockey

+0

Bonjour Pasternack! ça a marché ... !! Merci ..:] – rockey

+0

vous devez implémenter 'UITableViewDelegate' à votre' MyViewController 'pour pouvoir définir' myView.delegate = self; ' –

0

La réponse ci-dessus fonctionne très bien, mais sur l'iPad, la ligne myView.backgroundColor = [UIColor clearColor]; ne semble pas enlever la zone rectangulaire grise autour de la table. Je trouve que ce qui suit fait le travail: tableView.backgroundView.alpha = 0.0;

+0

La définition de tableView.backgroundView.alpha à 0 n'est pas une bonne idée. Définissez la vue sur nil à la place. '' tableView.backgroundView = nil; '' – ennalax