Ipphones

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg

Tuesday, 10 February 2009

Long Text Generic Editing Controller

Posted on 10:15 by Unknown
Another in my series of generic controller classes intended to be used in a navigation application. This one is for editing longer text. It uses a UITextView instead of a UITextField. There seems to be a bug in UITextView that's keeping me from changing the insertion point to the end of the text, but I have a bug report open with Apple on that, so hopefully either Apple will fix it, or tell me how to work around it. In the meantime, when editing existing values, the user will have to tap at the end of the text before typing.



Its use is nearly identical to the previous generic controller classes I posted. Just set your controller class as the generic controller class' delegate, set the string value you want to let the user edit, then implement the delegate method to get notified of the new value if the user makes any changes.

And here is the 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


Email ThisBlogThis!Share to XShare to Facebook
Posted in Controller Classes, iPhone SDK | No comments
Newer Post Older Post Home

0 comments:

Post a Comment

Subscribe to: Post Comments (Atom)

Popular Posts

  • Strong Encryption for Cocoa / Cocoa Touch
    Please do not use this code! Instead, check out Jim Dovey's Common Crypto code from AQToolkit . AES is a strong encryption standard tha...
  • Texture Coordinate Arrays or Things Nobody Tells You
    For some reason, a lot of OpenGL stuff just isn't well documented. Yes, I read the Red Book chapter on texturing. It didn't have a s...
  • Dynamically adding class objects
    Okay, folks, the first draft of the book is done, and I have some breathing room until the chapters start coming back from the tech reviewer...
  • Web Services Fun
    Before we work more with libxml, let's talk about web services. Web services are a good practical application of XML and, it would seem ...
  • An OpenGL Project Template for Xcode
    I'm not a fan of the OpenGL ES Application project template that ships with the iPhone SDK. It's a pain in the ass to go in and dele...
  • Handling Double Taps
    Alright, since the NDA is down, let's celebrate by posting some information, shall we? One question that I see posted a lot by new iPhon...
  • Twittering iPhone Developer List
    Tim Haines, the developer of the excellent BurnBall game, has started a list of iPhone developers who use Twitter. The last time I checked,...
  • More on OpenGL and Normals
    In an earlier post I talked about surface normals in OpenGL. In writing the Wavefront OBJ loading class, I've learned far more about no...
  • OpenGL ES From the Ground Up, Part 1 Addendum: Alphabet Soup
    One problem with blog postings is that they are self-edited. For my postings here, I have no external technical review and no copy editing d...
  • Writing
    I'm pretty swamped with writing work at the moment. The book project is going pretty well, and I'm fortunate to have a very experien...

Categories

  • 3D Models
  • Ad Hoc Distribution
  • ADC
  • Address Book
  • Amazon
  • Anaglyphs
  • App Store
  • Apple
  • Apple DTS
  • Apple Store
  • Application Store
  • articles
  • Award
  • Background Processing
  • Barcodes
  • Beta
  • Blog
  • Blogger
  • Blogging
  • Blogs
  • Blogspot
  • Book project
  • Bug Reporting
  • Captain Obvious
  • Categories
  • Censorship
  • CFFoundation
  • CGAffineTransform
  • Clang Static Analyzer
  • Cocoa
  • Cocoa Touch
  • Code Reuse
  • Code Signing
  • Computer
  • conferences
  • Controller Classes
  • Core Animation
  • Daring Fireball
  • Database
  • Debugging
  • Defect
  • Delegates
  • Design Awards
  • Developer Certifications
  • Discussion Forums
  • Edit Mode
  • employment opportunities
  • Encryption
  • Enterprise
  • Errata
  • free code
  • Free software
  • Full Screen
  • Game Programming
  • Gestures
  • Getting Started
  • goof
  • Google Code
  • Google Maps
  • Gotcha
  • Help
  • HIG
  • HTTP PUT
  • Idiots
  • Idle Timer
  • Images
  • Instruments
  • Interface Builder
  • iPHone
  • iPhone Applications
  • iPhone Dev Center
  • iPhone Developers
  • iPhone OS 3.0
  • iPhone SDK
  • iPhone SDK PNG
  • iPhone Simulator
  • iPhoneSDK
  • iPod
  • Job Opportunities.
  • k
  • Key Value Observing
  • Keynote
  • KVO
  • Landscape Mode
  • Learn Cocoa
  • Learn Cocoa on the Mac
  • libxml
  • Licensing
  • Mac Developers
  • Mac OS X
  • Macworld Expo
  • Microsoft
  • NDA
  • NeHe
  • New Category
  • New Release
  • NSFileHandle
  • NSMutableArray
  • NSMutableURLRequest
  • NSXML
  • Object-Oriented Design
  • Objective-C
  • Open Source
  • OpenGL ES
  • Optimizations
  • Other blogs
  • Paired Arrays
  • Parsing
  • Particle Engine
  • Party
  • PeopleSoft
  • Performance
  • Persistence
  • Pink Screen of Death
  • Piracy
  • Pixar
  • Podcasts
  • Press Release WTF
  • Press Releases WTF
  • private APIs Google
  • Project Template
  • Properties
  • Random Numbers
  • Rant
  • Rejected
  • Resources
  • Responder Chain
  • REST
  • Reverse Engineering
  • Rumors
  • Runtime
  • Sample Code
  • Screencast
  • screenshot
  • Scroll Views
  • snippet
  • Snow Leopard.
  • SOAP
  • Sockets
  • Source
  • Splash Screen
  • SQLite
  • SQLitePersistentObjects
  • Steve Jobs
  • Steve-Note
  • Strings
  • Stupidity
  • Subversion
  • Table Views
  • Taps
  • Template
  • Tip
  • Tips
  • Tririga
  • tutorials
  • Twitter
  • UIAlertView
  • UIColor
  • UIImage
  • UIPickerView
  • UIScrollView
  • UITextField
  • UIView
  • UIWebView
  • Update
  • Utilities
  • UUID
  • Vacation
  • Version Control
  • Web Services
  • Writing
  • WTF
  • WWDC
  • Xcode
  • XML

Blog Archive

  • ▼  2009 (141)
    • ►  May (14)
    • ►  April (30)
    • ►  March (48)
    • ▼  February (26)
      • 360 iDev Conference, T-Minus 18 hours
      • Mapping Directions from your App
      • Reusable Code in Google Code
      • Alert View with Prompt
      • Editable Select List
      • BWToolkit
      • Asynchronous Downloading of Images in a Table View
      • Rogue Amoeba is Hiring
      • Cross Development Hint
      • Making OpenGL ES Screenshot
      • Programmatically Drawing Gloss Gradients
      • All Generic Controllers to Date (Zip File)
      • Generic Selection List Controller
      • Computer Books & the Economy
      • What Are All the Cool Kids Doing These Days?
      • 360 iDev Conferences
      • Strong Encryption for Cocoa / Cocoa Touch
      • CLANG Static Analyzer
      • Long Text Generic Editing Controller
      • Same but Different
      • Accessorizer
      • Gameplay Videos
      • KVO and the iPhone SDK
      • Learn Cocoa
      • SQLitePersistentObjects Update
      • Longer Spinning & Blurring v2.0
    • ►  January (23)
  • ►  2008 (163)
    • ►  December (46)
    • ►  November (25)
    • ►  October (44)
    • ►  September (2)
    • ►  August (5)
    • ►  July (2)
    • ►  June (9)
    • ►  May (2)
    • ►  April (11)
    • ►  March (17)
Powered by Blogger.

About Me

Unknown
View my complete profile