Un autre de mes séries de classes contrôleur générique destiné à être utilisé dans une application de navigation. Celui-ci est pour l'édition de texte plus long. Il utilise un UITextView au lieu d'un UITextField. Il semble y avoir un bug dans UITextView qui m'empêche de changer le point d'insertion à la fin du texte, mais j'ai un rapport de bogue ouvert avec Apple à ce sujet, alors j'espère que ce soit Apple va le réparer, ou me dire comment faire pour contourner elle. En attendant, lors de l'édition des valeurs existantes, l'utilisateur aura à exploiter à la fin du texte avant de taper.

Son utilisation est presque identique à la précédente classe contrôleur générique que j'ai posté. Il suffit de définir votre classe de contrôleur en tant que délégué de la classe contrôleur générique », définissez la valeur chaîne que vous voulez laisser le modifier utilisateur, puis appliquer la méthode du délégué pour être averti de la nouvelle valeur si l'utilisateur effectue des changements.
Et voici le code
LongTextFieldViewController.h
LongTextFieldViewController.m
Son utilisation est presque identique à la précédente classe contrôleur générique que j'ai posté. Il suffit de définir votre classe de contrôleur en tant que délégué de la classe contrôleur générique », définissez la valeur chaîne que vous voulez laisser le modifier utilisateur, puis appliquer la méthode du délégué pour être averti de la nouvelle valeur si l'utilisateur effectue des changements.
Et voici le code
LongTextFieldViewController.h
//
// LongTextFieldViewController.h
// iContractor
//
// Created by Jeff LaMarche on 2/10/09.
// Copyright 2009 Jeff LaMarche Consulting. All rights reserved.
//
#import <UIKit/UIKit.h>
@protocol LongTextFieldEditingViewControllerDelegate <NSObject>
@required
- (void)takeNewString:(NSString *)newValue;
- (UINavigationController *)navController; // Return the navigation controller
@end
@interface LongTextFieldViewController : UITableViewController
{
NSString *string;
UITextView *textView;
id<LongTextFieldEditingViewControllerDelegate> delegate;
}
@property (nonatomic, retain) NSString *string;
@property (nonatomic, retain) IBOutlet UITextView *textView;
@property (nonatomic, assign) id <LongTextFieldEditingViewControllerDelegate> delegate;
- (void)cancel;
- (void)save;
@end
LongTextFieldViewController.m
//
// LongTextFieldViewController.m
// iContractor
//
// Created by Jeff LaMarche on 2/10/09.
// Copyright 2009 Jeff LaMarche Consulting. All rights reserved.
//
#import "LongTextFieldViewController.h"
@implementation LongTextFieldViewController
@synthesize string;
@synthesize textView;
@synthesize delegate;
- (void)cancel
{
[[self.delegate navController] popViewControllerAnimated:YES];
}
- (void)save
{
[self.delegate takeNewString:textView.text];
[[self.delegate navController] popViewControllerAnimated:YES];
}
#pragma mark -
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated
{
NSUInteger firstRowIndices[] = {0,0};
NSIndexPath *firstRowPath = [NSIndexPath indexPathWithIndexes:firstRowIndices length:2];
UITableViewCell *firstCell = [self.tableView cellForRowAtIndexPath:firstRowPath];
UITextView *firstCellTextField = nil;
for (UIView *oneView in firstCell.contentView.subviews)
{
if ([oneView isMemberOfClass:[UITextView class]])
firstCellTextField = (UITextView *)oneView;
}
[firstCellTextField becomeFirstResponder];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc]
initWithTitle:NSLocalizedString(@"Cancel", @"Cancel - for button to cancel changes")
style:UIBarButtonItemStylePlain
target:self
action:@selector(cancel)];
self.navigationItem.leftBarButtonItem = cancelButton;
[cancelButton release];
UIBarButtonItem *saveButton = [[UIBarButtonItem alloc]
initWithTitle:NSLocalizedString(@"Save", @"Save - for button to save changes")
style:UIBarButtonItemStylePlain
target:self
action:@selector(save)];
self.navigationItem.rightBarButtonItem = saveButton;
[saveButton release];
[super viewWillAppear:animated];
}
- (void)dealloc
{
[string release];
[textView release];
[super dealloc];
}
#pragma mark Tableview methods
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *LongTextFieldCellIdentifier = @"LongTextFieldCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LongTextFieldCellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:LongTextFieldCellIdentifier] autorelease];
UITextView *theTextView = [[UITextView alloc] initWithFrame:CGRectMake(10.0, 10.0, 280.0, 161.0)];
theTextView.editable = YES;
theTextView.text = string;
theTextView.font = [UIFont systemFontOfSize:14.0];
[theTextView becomeFirstResponder];
self.textView = theTextView;
[[cell contentView] addSubview:theTextView];
[theTextView release];
}
// This doesn't work - no matter where I put it. It's almost as if this property is readonly
textView.selectedRange = NSMakeRange([string length], 0);;
return cell;
}
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
return nil;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Nothing for now
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 181.0;
}
@end
Aucun commentaire:
Enregistrer un commentaire