<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Software Promotion + SEO</title>
	<atom:link href="http://blog.softtester.com/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.softtester.com</link>
	<description>This blog covers a range of topics concerning the SoftTester Shareware/ Software Download site. Topics include software product releases as well as SEO and software development information and tips.</description>
	<lastBuildDate>Fri, 06 Jan 2012 20:45:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Balance Guide v1.6 iPhone App</title>
		<link>http://blog.softtester.com/index.php/2012/01/balance-guide-v1-6-iphone-app/</link>
		<comments>http://blog.softtester.com/index.php/2012/01/balance-guide-v1-6-iphone-app/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 20:45:58 +0000</pubDate>
		<dc:creator>Dipsy</dc:creator>
				<category><![CDATA[iPhone / iPad Development]]></category>

		<guid isPermaLink="false">http://blog.softtester.com/?p=711</guid>
		<description><![CDATA[What&#8217;s new in the latest version of Balance Guide ? The multi-account feature has been extended further and now includes transfers between accounts. To provide maximum flexibly, the transfer feature allows you enter a different description and date, catering for differences in clearing. Also a backup and restore feature via Dropbox Balance Guide iPhone app]]></description>
			<content:encoded><![CDATA[<p>What&#8217;s new in the latest version of Balance Guide ?</p>
<p>The multi-account feature has been extended further and now includes transfers between accounts. To provide maximum flexibly, the transfer feature allows you enter a different description and date, catering for differences in clearing.</p>
<p>Also a backup and restore feature via Dropbox</p>
<p><a href="http://itunes.apple.com/gb/app/balance-guide-personal-account/id427557586?ls=1&#038;mt=8">Balance Guide iPhone app</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softtester.com/index.php/2012/01/balance-guide-v1-6-iphone-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My security in-security obesession for the year</title>
		<link>http://blog.softtester.com/index.php/2010/10/my-security-in-security-obesession-for-the-year/</link>
		<comments>http://blog.softtester.com/index.php/2010/10/my-security-in-security-obesession-for-the-year/#comments</comments>
		<pubDate>Sun, 10 Oct 2010 08:41:57 +0000</pubDate>
		<dc:creator>Dipsy</dc:creator>
				<category><![CDATA[Tech Talk]]></category>

		<guid isPermaLink="false">http://blog.softtester.com/?p=691</guid>
		<description><![CDATA[We&#8217;ll our kaspersky internet security renewal was coming up so we upgraded. Been good this year, with other products we normally go for something different but have no complaints. So had a look to see what I could get for my mac mini and they don&#8217;t have a internet security package, but they have AV [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;ll our kaspersky internet security renewal was coming up so we upgraded. Been good this year, with other products we normally go for something different but have no complaints. </p>
<p>So had a look to see what I could get for my mac mini and they don&#8217;t have a internet security package, but they have AV so I bought that too <img src='http://blog.softtester.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  also turned on the snow leopard firewall.</p>
<p>Phew&#8230;</p>
<p>by JM</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softtester.com/index.php/2010/10/my-security-in-security-obesession-for-the-year/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone, why I moved from FMDB to direct Sqlite3</title>
		<link>http://blog.softtester.com/index.php/2010/09/iphone-why-i-moved-from-fmdb-to-direct-sqlite3/</link>
		<comments>http://blog.softtester.com/index.php/2010/09/iphone-why-i-moved-from-fmdb-to-direct-sqlite3/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 17:30:58 +0000</pubDate>
		<dc:creator>Dipsy</dc:creator>
				<category><![CDATA[iPhone / iPad Development]]></category>

		<guid isPermaLink="false">http://blog.softtester.com/?p=686</guid>
		<description><![CDATA[I&#8217;m still quite disappointed, FMDB was easy to implement and only a few lines of code to do almost anything. I&#8217;ve even posted some example code on my blog. But when I sat and thought about, I realised I&#8217;d wasted two days (in total) trying figure out why sql wasn&#8217;t working. There must be some [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m still quite disappointed, FMDB was easy to implement and only a few lines of code to do almost anything. I&#8217;ve even posted some example code on my blog. But when I sat and thought about, I realised I&#8217;d wasted two days (in total) trying figure out why sql wasn&#8217;t working.</p>
<p>There must be some problems in the libraries as the sql was working but failed on simple sql statements.</p>
<p>So today I&#8217;ve decided to use Sqlite3 directly, which has taken me have a day and I have all the previous code replaced and working. Yes, it takes more code and is more difficult to implement.</p>
<p>by JM</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softtester.com/index.php/2010/09/iphone-why-i-moved-from-fmdb-to-direct-sqlite3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone, how to insert a record using fmdb</title>
		<link>http://blog.softtester.com/index.php/2010/09/iphone-how-to-insert-a-record-using-fmdb/</link>
		<comments>http://blog.softtester.com/index.php/2010/09/iphone-how-to-insert-a-record-using-fmdb/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 17:08:38 +0000</pubDate>
		<dc:creator>Dipsy</dc:creator>
				<category><![CDATA[iPhone / iPad Development]]></category>

		<guid isPermaLink="false">http://blog.softtester.com/?p=675</guid>
		<description><![CDATA[One of the easiest ways to perform transactions with a database with the iPhone is with the fmdb libraries. Its a few lines of code to do almost anything. This is the primary documentation for fmdb http://gusmueller.com/blog/archives/2005/3/22.html It&#8217;s pretty good and straight forward. But, I&#8217;ve had some problems today trying to insert a record. None [...]]]></description>
			<content:encoded><![CDATA[<p>One of the easiest ways to perform transactions with a database with the iPhone is with the fmdb libraries. Its a few lines of code to do almost anything.</p>
<p>This is the primary documentation for fmdb <a href="http://gusmueller.com/blog/archives/2005/3/22.html">http://gusmueller.com/blog/archives/2005/3/22.html</a></p>
<p>It&#8217;s pretty good and straight forward. But, I&#8217;ve had some problems today trying to insert a record. None of the usage code I found on the web seemed to be any different to the code I was using.</p>
<p>However, after inserting one field at a time I found my problem was due to using an integer where I needed to use NSNumber. So I thought I&#8217;d post the code I arrived at, maybe it will help someone else.</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>
<code>NSMutableString *strAmount = [NSMutableString stringWithString:txtAmount.text];<br />
[strAmount replaceCharactersInRange: [strAmount rangeOfString: strCurrencySymbol]  withString:@""];</code></p>
<p><code>NSString *strRecurrance = [self.pickerRecurranceData objectAtIndex:intSelRecurrenceRow];<br />
NSArray *parts = [strRecurrance componentsSeparatedByString: @" "];<br />
</code><br />
<code>NSNumber *numInterval = [NSNumber numberWithInt:[[parts objectAtIndex:0] intValue]];<br />
NSString *strIntervalType = [parts objectAtIndex:1];<br />
</code><br />
<code>// string to date<br />
NSString *myDateString = btnStartDate.titleLabel.text;<br />
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];<br />
[dateFormatter setDateFormat:@"dd MM yyyy"];<br />
NSDate *datStartDate = [[NSDate alloc] init];<br />
datStartDate = [dateFormatter dateFromString:myDateString];<br />
</code><code><br />
NSString *strDesc = txtDescription.text;</code><br />
<code><br />
FMDatabase* db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];<br />
if (![db open]) {<br />
NSLog(@"Could not open db.");<br />
}<br />
</code><code><br />
if (![db tableExists:@"mytable"]) {<br />
[db executeUpdate:@"CREATE TABLE 'mytable' ('pid' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,'desc' VARCHAR,'sdate' DATETIME,'interval' INTEGER,'itype' VARCHAR,'price' DOUBLE);", nil];<br />
}<br />
</code><code><br />
[db beginTransaction];</code><br />
<code><br />
[db executeUpdate:@"INSERT INTO mytable (desc,sdate,interval,itype,price) VALUES (?,?,?,?,?);",<br />
strDesc, datStartDate, numInterval, strIntervalType, strAmount, nil];<br />
</code><code><br />
//NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);<br />
</code><code><br />
[db commit];<br />
[db close];<br />
</code>
</td>
</tr>
</tbody>
</table>
<p>by JM</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softtester.com/index.php/2010/09/iphone-how-to-insert-a-record-using-fmdb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to add a decimal point or a done button to the iphone number pad</title>
		<link>http://blog.softtester.com/index.php/2010/09/how-to-add-a-decimal-point-or-a-done-button-to-the-iphone-number-pad/</link>
		<comments>http://blog.softtester.com/index.php/2010/09/how-to-add-a-decimal-point-or-a-done-button-to-the-iphone-number-pad/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 08:23:08 +0000</pubDate>
		<dc:creator>Dipsy</dc:creator>
				<category><![CDATA[iPhone / iPad Development]]></category>

		<guid isPermaLink="false">http://blog.softtester.com/?p=665</guid>
		<description><![CDATA[Following on from our blog post about how to add the done button to the iphone number pad, here&#8217;s how upgrade that code to add a decimal point as well, well not at the same time How to add your own Done button to the iPhone numeric keypad Ok, first of all if you haven&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Following on from our blog post about how to add the done button to the iphone number pad, here&#8217;s how upgrade that code to add a decimal point as well, well not at the same time <img src='http://blog.softtester.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a title="How to add your own Done button to the iPhone numeric keypad" href="http://blog.softtester.com/index.php/2010/08/how-to-add-your-own-done-button-to-the-iphone-numeric-keypad/" target="_blank">How to add your own Done button to the iPhone numeric keypad</a></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/LBNaPwUssOo?hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/LBNaPwUssOo?hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Ok, first of all if you haven&#8217;t done so already, get the code working posted in the done blog post.</p>
<p>Now open up your NumberKeypadModController.h file and add the following to the top of the file below your foundation import.</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>#define KeyPadTypeDoneButton 1<br />
#define KeyPadTypeDecimalPoint 2</td>
</tr>
</tbody>
</table>
<p>Add this to the interface.</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>int intKeyPadType;</td>
</tr>
</tbody>
</table>
<p>And this under properties</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>- (void)setKeyPadType:(int)value;<br />
-(id)initWithKeyPadType: (int)value;</td>
</tr>
</tbody>
</table>
<p>Now open your NumberKeypadModController.m file and add.</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>-(id)initWithKeyPadType: (int)value<br />
{<br />
[self setKeyPadType:value];<br />
//self = [super init];<br />
self = [self init];<br />
if( self != nil )</p>
<p>{<br />
//self.intKeyPadType = value;</p>
<p>}<br />
return self;</p>
<p>}</p>
<p>- (void)setKeyPadType:(int)value {<br />
intKeyPadType = value;<br />
NSLog(@&#8221;key=%i&#8221;, intKeyPadType);<br />
}</td>
</tr>
</tbody>
</table>
<p>Now where you see the line containing @&#8221;Done&#8221;, replace that with ..</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>if (intKeyPadType == KeyPadTypeDecimalPoint ) {<br />
doneButton.titleLabel.font = [UIFont systemFontOfSize:35];<br />
[doneButton setTitle:@"." forState:UIControlStateNormal];<br />
} else if (intKeyPadType == KeyPadTypeDoneButton ) {<br />
doneButton.titleLabel.font = [UIFont boldSystemFontOfSize:18];<br />
[doneButton setTitle:@"DONE" forState:UIControlStateNormal];<br />
}</td>
</tr>
</tbody>
</table>
<p>Also replace the following functions</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>- (void)textFieldShouldEndEditing:(UITextField *)textField {<br />
if (textField.keyboardType != UIKeyboardTypeNumberPad)<br />
{<br />
doneButtonShownRecently = YES;<br />
if (intKeyPadType == KeyPadTypeDoneButton ) {<br />
[self performSelector:@selector(considerDoneButtonReallyHidden) withObject:nil afterDelay:SLIDE_OUT_ANIMATION_DURATION];<br />
}<br />
return;<br />
}<br />
[self removeDoneFromKeyboard];<br />
}</p>
<p>- (void) donePressed {</p>
<p>if (intKeyPadType == KeyPadTypeDecimalPoint ) {<br />
NSString *currentText = currentTextField.text;<br />
if ([currentText rangeOfString:@"." options:NSBackwardsSearch].length == 0) {<br />
currentTextField.text = [currentTextField.text stringByAppendingString:@"."];<br />
}else {<br />
//alreay has a decimal point<br />
}<br />
} else if (intKeyPadType == KeyPadTypeDoneButton ) {<br />
[self.currentTextField resignFirstResponder];<br />
}<br />
if ([delegate respondsToSelector:@selector(donePressed:)])<br />
[delegate performSelector:@selector(donePressed:) withObject:self.currentTextField];<br />
}</td>
</tr>
</tbody>
</table>
<p>At this point, I&#8217;d like to cite and give credit to DevUp for the decimal point formatting code in the donePressed function above.<br />
<a rel="nofollow" href="http://blog.devedup.com/index.php/2010/03/13/iphone-number-pad-with-a-decimal-point/" target="_blank">http://blog.devedup.com/index.php/2010/03/13/iphone-number-pad-with-a-decimal-point/</a></p>
<p>Now in you useage code replace the following code..</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>int intCurrentKeyPad;</p>
<p>- (void)viewDidLoad {<br />
[super viewDidLoad];<br />
//intCurrentKeyPad = KeyPadTypeDoneButton;<br />
intCurrentKeyPad = KeyPadTypeDecimalPoint;</p>
<p>self.numberKeyPadModController = [[[NumberKeypadModController alloc] initWithKeyPadType:intCurrentKeyPad] autorelease];<br />
//self.numberKeyPadModController = [[[NumberKeypadModController alloc] init] autorelease];<br />
numberKeyPadModController.delegate = self;</p>
<p>[numberKeyPadModController setKeyPadType:intCurrentKeyPad];</p>
<p>if (intCurrentKeyPad == KeyPadTypeDoneButton ) {<br />
[[NSNotificationCenter defaultCenter] addObserver:self<br />
selector:@selector(doneButton:) name:@&#8221;DoneButtonPressed&#8221; object:nil];<br />
}</p>
<p>textFieldRow1.delegate = self;<br />
}</p>
<p>- (void)doneButtonPressed:(UITextField*)sender{<br />
if (intCurrentKeyPad == KeyPadTypeDoneButton ) {<br />
if ([textFieldRow1 isEditing]) {<br />
[textFieldRow1 resignFirstResponder];<br />
}<br />
}<br />
}</p>
<p>- (void) donePressed:(id)sender {<br />
if (intCurrentKeyPad == KeyPadTypeDoneButton ) {<br />
UIView* firstResponder = [self.view findFirstResponder];<br />
[firstResponder resignFirstResponder];<br />
}<br />
}</td>
</tr>
</tbody>
</table>
<p>Ok I hope this helps you out!</p>
<p>Feel free to make a comment about this article, let me know if you have any problems with it.</p>
<p>by Jules.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softtester.com/index.php/2010/09/how-to-add-a-decimal-point-or-a-done-button-to-the-iphone-number-pad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to add your own Done button to the iPhone numeric keypad</title>
		<link>http://blog.softtester.com/index.php/2010/08/how-to-add-your-own-done-button-to-the-iphone-numeric-keypad/</link>
		<comments>http://blog.softtester.com/index.php/2010/08/how-to-add-your-own-done-button-to-the-iphone-numeric-keypad/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 12:24:20 +0000</pubDate>
		<dc:creator>Dipsy</dc:creator>
				<category><![CDATA[iPhone / iPad Development]]></category>
		<category><![CDATA[Tech Talk]]></category>

		<guid isPermaLink="false">http://blog.softtester.com/?p=648</guid>
		<description><![CDATA[Last revised 22nd September 2010 &#8211; as I missed some code from this article. There are several issues which you must be aware of when working around the missing done button on the iPhone numeric keypad. Use of private API&#8217;s is frowned upon by apple and they can reject your application. Also a lot of [...]]]></description>
			<content:encoded><![CDATA[<p>Last revised 22nd September 2010 &#8211; as I missed some code from this article.</p>
<p>There are several issues which you must be aware of when working around the missing done button on the iPhone numeric keypad. Use of private API&#8217;s is frowned upon by apple and they can reject your application. Also a lot of the solutions out there don&#8217;t work very well for OS4. This solution works by drawing a button on top of the keypad and animating it off the screen when required. It also draws the text so you don&#8217;t have to rely on images.</p>
<p>Firstly add a header file call it something like NumberKeypadModController.h also create an M file. Add the follow code to your H file.</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>#import &lt;Foundation/Foundation.h&gt;</p>
<p>@protocol NumberKeypadModControllerDelegate &lt;NSObject&gt;</p>
<p>- (void) donePressed:(id)sender;</p>
<p>@end</p>
<p>/**<br />
*    The class used to create the keypad<br />
*/<br />
@interface NumberKeypadModController : NSObject<br />
{<br />
NSTimer *fixKeyboardTimer;<br />
UIButton *doneButton;<br />
UITextField *currentTextField;<br />
id&lt;NumberKeypadModControllerDelegate&gt; delegate;<br />
int        showHideCounter;<br />
BOOL    doneButtonShown;<br />
BOOL    doneButtonShownRecently;<br />
}</p>
<p>@property (nonatomic, retain) NSTimer *fixKeyboardTimer;</p>
<p>@property (nonatomic, retain) UIButton *doneButton;<br />
@property (nonatomic, retain) UITextField *currentTextField;</p>
<p>@property (nonatomic, retain) id&lt;NumberKeypadModControllerDelegate&gt; delegate;</p>
<p>- (void)textFieldShouldBeginEditing:(UITextField *)textField;<br />
- (void)textFieldDidBeginEditing:(UITextField *)textField;<br />
- (void)textFieldShouldEndEditing:(UITextField *)textField;</p>
<p>- (void)resignedResponderWithView:(UIView*)textField;</p>
<p>@end</td>
</tr>
</tbody>
</table>
<p>And your M file</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>#import &#8220;NumberKeypadModController.h&#8221;</p>
<p>@interface NumberKeypadModController (PrivateMethods)<br />
- (void) addDoneToKeyboard;<br />
- (void) removeDoneFromKeyboard;<br />
- (void) donePressed;<br />
@end</p>
<p>#define PRE_SLIDING_DELAY_DURATION        0.1<br />
#define SLIDE_IN_ANIMATION_DURATION    0.2<br />
#define SLIDE_OUT_ANIMATION_DURATION    0.15</p>
<p>#define USE_TEXTURED_BUTTON        0</p>
<p>@implementation NumberKeypadModController</p>
<p>@synthesize fixKeyboardTimer;</p>
<p>@synthesize doneButton;<br />
@synthesize currentTextField;</p>
<p>@synthesize delegate;</p>
<p>- (id)init {<br />
if (self = [super init]) {<br />
self.fixKeyboardTimer = nil;<br />
#if (USE_TEXTURED_BUTTON != 0)<br />
self.doneButton = [UIButton buttonWithType:UIButtonTypeCustom];<br />
doneButton.frame = CGRectMake(0, 480, 105, 53);<br />
if ([[[UIDevice currentDevice] systemVersion] hasPrefix:@&#8221;3&#8243;]) {<br />
doneButton.frame = CGRectMake(0, 480, 105, 53);<br />
[doneButton setImage:[UIImage imageNamed:@"DoneUp3.png"] forState:UIControlStateNormal];<br />
[doneButton setImage:[UIImage imageNamed:@"DoneDown3.png"] forState:UIControlStateHighlighted];<br />
} else {<br />
[doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];<br />
[doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];<br />
}<br />
#else<br />
self.doneButton = [UIButton buttonWithType:UIButtonTypeCustom];<br />
doneButton.frame = CGRectMake(0, 480, 105, 53);<br />
if ([[[UIDevice currentDevice] systemVersion] hasPrefix:@&#8221;3&#8243;])<br />
doneButton.frame = CGRectMake(0, 480, 105, 53);<br />
doneButton.titleLabel.font = [UIFont boldSystemFontOfSize:18];<br />
[doneButton setTitleColor:[UIColor colorWithRed:60.0f/255.0f green:64.0f/255.0f blue:73.0f/255.0f alpha:1.0] forState:UIControlStateNormal];<br />
[doneButton setBackgroundImage:[UIImage imageNamed:@"doneKeyDownBackground.png"] forState:UIControlStateHighlighted];<br />
[doneButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];<br />
[doneButton setTitle:@"DONE" forState:UIControlStateNormal];<br />
#endif</p>
<p>[doneButton addTarget:self action:@selector(donePressed) forControlEvents:UIControlEventTouchUpInside];</p>
<p>self.currentTextField = nil;<br />
self.delegate = nil;</p>
<p>showHideCounter = 0;<br />
doneButtonShown = NO;<br />
}<br />
return self;<br />
}</p>
<p>- (void)textFieldShouldBeginEditing:(UITextField *)textField {<br />
if (textField.keyboardType != UIKeyboardTypeNumberPad)<br />
{<br />
doneButton.hidden = YES;<br />
doneButtonShownRecently = YES;<br />
}<br />
}</p>
<p>- (void)textFieldDidBeginEditing:(UITextField *)textField {<br />
if (textField.keyboardType != UIKeyboardTypeNumberPad)<br />
return;</p>
<p>//    NSLog(@&#8221;textFieldDidBeginEditing&#8221;);<br />
self.currentTextField = textField; //Save reference to current textfield being edited</p>
<p>if (!doneButtonShownRecently)<br />
{<br />
if (fixKeyboardTimer)<br />
[fixKeyboardTimer invalidate];<br />
self.fixKeyboardTimer = [NSTimer timerWithTimeInterval:PRE_SLIDING_DELAY_DURATION target:self<br />
selector:@selector(addDoneToKeyboard) userInfo:nil repeats:NO];<br />
[[NSRunLoop currentRunLoop] addTimer:fixKeyboardTimer forMode:NSDefaultRunLoopMode];<br />
} else<br />
{<br />
[doneButton removeFromSuperview];<br />
[self addDoneToKeyboard];<br />
}<br />
}</p>
<p>- (void)textFieldShouldEndEditing:(UITextField *)textField {<br />
if (textField.keyboardType != UIKeyboardTypeNumberPad)<br />
{<br />
doneButtonShownRecently = YES;<br />
[self performSelector:@selector(considerDoneButtonReallyHidden) withObject:nil afterDelay:SLIDE_OUT_ANIMATION_DURATION];<br />
return;<br />
}<br />
[self removeDoneFromKeyboard];<br />
}</p>
<p>- (void) textFieldDidEndEditing:(UITextField *)textField {<br />
}</p>
<p>- (void)resignedResponderWithView:(UIView*)textField {<br />
//    NSLog(@&#8221;resignedResponderWithView&#8221;);<br />
[self removeDoneFromKeyboard];<br />
}</p>
<p>- (void) addDoneToKeyboard {<br />
//    NSLog(@&#8221;addDoneToKeyboard&#8221;);</p>
<p>doneButton.hidden =  NO;</p>
<p>//Add a button to the top, above all windows<br />
NSArray *allWindows = [[UIApplication sharedApplication] windows];<br />
NSUInteger topWindowIndex = [allWindows count] &#8211; 1;<br />
UIWindow *topWindow = [allWindows objectAtIndex:topWindowIndex];</p>
<p>// check if top window is of keypad or else<br />
NSString *topViewClassName = [NSString stringWithFormat:@"%@", [topWindow class]];<br />
while (![topViewClassName isEqualToString:@"UITextEffectsWindow"] ) {<br />
&#8211;topWindowIndex;</p>
<p>if(topWindowIndex &lt; 0)<br />
break;</p>
<p>topWindow = [allWindows objectAtIndex:topWindowIndex];<br />
topViewClassName = [NSString stringWithFormat:@"%@", [topWindow class]];<br />
}</p>
<p>if(topWindowIndex &lt; 0) {<br />
topWindowIndex = [allWindows count] &#8211; 1;<br />
topWindow = [allWindows objectAtIndex:topWindowIndex];<br />
}</p>
<p>if (doneButton.superview)<br />
[doneButton removeFromSuperview];</p>
<p>[topWindow addSubview:doneButton];</p>
<p>if (!doneButtonShownRecently) {<br />
[UIView beginAnimations:nil context:nil];<br />
[UIView setAnimationBeginsFromCurrentState:YES];<br />
[UIView setAnimationDuration:SLIDE_IN_ANIMATION_DURATION];<br />
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];<br />
doneButton.frame = CGRectMake(0, 480-53, doneButton.frame.size.width, 53);<br />
[UIView commitAnimations];<br />
} else {<br />
doneButton.frame = CGRectMake(0, 427, doneButton.frame.size.width, 53);<br />
}</p>
<p>doneButtonShown = YES;<br />
}</p>
<p>- (void) removeDoneFromKeyboard {<br />
//    NSLog(@&#8221;removeDoneFromKeyboard&#8221;);</p>
<p>[fixKeyboardTimer invalidate];<br />
self.fixKeyboardTimer = nil;</p>
<p>if (!doneButtonShownRecently) {<br />
[UIView beginAnimations:nil context:nil];<br />
[UIView setAnimationBeginsFromCurrentState:YES];<br />
[UIView setAnimationDuration:SLIDE_OUT_ANIMATION_DURATION];<br />
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];<br />
doneButton.frame = CGRectMake(0, 480, doneButton.frame.size.width, 53);<br />
[UIView commitAnimations];<br />
} else {<br />
doneButton.frame = CGRectMake(0, 480, doneButton.frame.size.width, 53);<br />
}</p>
<p>doneButtonShown = NO;<br />
doneButtonShownRecently = YES;<br />
[self performSelector:@selector(considerDoneButtonReallyHidden) withObject:nil afterDelay:SLIDE_OUT_ANIMATION_DURATION];<br />
}</p>
<p>- (void)considerDoneButtonReallyHidden {<br />
//    NSLog(@&#8221;considerDoneButtonReallyHidden&#8221;);<br />
doneButtonShownRecently = NO;<br />
}</p>
<p>- (void) donePressed {<br />
[self.currentTextField resignFirstResponder];<br />
if ([delegate respondsToSelector:@selector(donePressed:)])<br />
[delegate performSelector:@selector(donePressed:) withObject:self.currentTextField];<br />
}</p>
<p>- (void) dealloc {<br />
[fixKeyboardTimer release];<br />
[doneButton removeFromSuperview];<br />
[doneButton release];<br />
[delegate release];<br />
[super dealloc];<br />
}</p>
<p>@end</td>
</tr>
</tbody>
</table>
<p>Now to your view header file add an import to NumberKeypadModController.h</p>
<p>Now its imple matter of adding a delegate to your interface and a property on the view your going to use  the code. In your viewdidload add this code.</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>@interface YourViewController : UIViewController &lt;UITextFieldDelegate, NumberKeypadModControllerDelegate&gt; {</p>
<p>NumberKeypadModController *numberKeyPadModController;<br />
IBOutlet UITextField *textFieldRow1;<br />
}</p>
<p>@property(nonatomic,retain) NumberKeypadModController *numberKeyPadModController;<br />
@property(nonatomic,retain) UITextField *textFieldRow1;</p>
<p>@end</td>
</tr>
</tbody>
</table>
<p>And your m file.</p>
<table border="0" cellpadding="5" bgcolor="#dcedf7">
<tbody>
<tr>
<td>#import &#8220;YourViewController.h&#8221;<br />
#import &#8220;NumberKeypadModController.h&#8221;</p>
<p>@interface UIView (FindAndResignFirstResponder)<br />
- (UIView*)findFirstResponder;<br />
@end<br />
@implementation UIView (FindAndResignFirstResponder)<br />
- (UIView*)findFirstResponder {<br />
if (self.isFirstResponder) {<br />
[self resignFirstResponder];<br />
return self;<br />
}<br />
for (UIView *subView in self.subviews) {<br />
if ([subView findFirstResponder])<br />
return subView;<br />
}<br />
return nil;<br />
}<br />
@end</p>
<p>@implementation YourViewController</p>
<p>@synthesize numberKeyPadModController;<br />
@synthesize textFieldRow1;</p>
<p>- (void)viewDidLoad {<br />
[super viewDidLoad];</p>
<p>self.numberKeyPadModController = [[[NumberKeypadModController alloc] init] autorelease];<br />
numberKeyPadModController.delegate = self;</p>
<p>[[NSNotificationCenter defaultCenter] addObserver:self<br />
selector:@selector(doneButton:) name:@&#8221;DoneButtonPressed&#8221; object:nil];</p>
<p>textFieldRow1.delegate = self;<br />
}</p>
<p>- (void)doneButtonPressed:(UITextField*)sender{<br />
if ([textFieldRow1 isEditing]) {<br />
[textFieldRow1 resignFirstResponder];<br />
}<br />
}</p>
<p>- (void) donePressed:(id)sender {<br />
UIView* firstResponder = [self.view findFirstResponder];<br />
[firstResponder resignFirstResponder];<br />
}</p>
<p>- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {<br />
[numberKeyPadModController textFieldShouldBeginEditing:textField];</p>
<p>return YES;<br />
}</p>
<p>- (void) textFieldDidBeginEditing:(UITextField *)textField {<br />
[numberKeyPadModController textFieldDidBeginEditing:textField];<br />
}</p>
<p>- (BOOL) textFieldShouldEndEditing:(UITextField *)textField {<br />
[numberKeyPadModController textFieldShouldEndEditing:textField];<br />
return YES;<br />
}</p>
<p>-(void)touchesBegan <img src='http://blog.softtester.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> NSSet *)touches withEvent:(UIEvent *)event {<br />
UIView* firstResponder = [self.view findFirstResponder];<br />
[firstResponder resignFirstResponder];<br />
[numberKeyPadModController resignedResponderWithView:firstResponder];</p>
<p>[super touchesBegan:touches withEvent:event];<br />
}</p>
<p>- (void)didReceiveMemoryWarning {<br />
[super didReceiveMemoryWarning];<br />
}</p>
<p>- (void)viewDidUnload {<br />
// Release any retained subviews of the main view.<br />
// e.g. self.myOutlet = nil;<br />
}</p>
<p>- (void)dealloc {<br />
[super dealloc];<br />
}</p>
<p>@end</td>
</tr>
</tbody>
</table>
<p>Now in interface builder add a UITextField and assign the outlet, save and run.</p>
<p>I`m currently looking at making a decimal point version of this. I have seen others of the web, but the animation isn`t as good as mine. <img src='http://blog.softtester.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>If you find this code helpful please consider buying a copy of our app. Suggestions and feedback our also welcome.</p>
<p><a href="http://www.kidsmathstore.com/stt-itunes-gb.php">iTunes page Speaking Times Table iPhone App</a></p>
<p><a href="http://www.kidsmathstore.com/stt-itunes-gb.php"><img class="size-full wp-image-313" title="Speaking Times Tables - Available on the App Store" src="http://www.kidsmathstore.com/info/wp-content/uploads/2010/07/appstore.png" alt="Speaking Times Tables - Available on the App Store" width="150" height="57" /></a></p>
<p>I&#8217;d be happy to talk further about the code, please leave your comments below, you&#8217;ll notice from our app that we also use a bar above the keypad, which I haven&#8217;t included in the above code.</p>
<p>ALSO LET ME KNOW IF YOU HAVE ANY PROBLEMS WITH THIS CODE !!</p>
<p>by JM</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softtester.com/index.php/2010/08/how-to-add-your-own-done-button-to-the-iphone-numeric-keypad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to, link my bug reports submissions into my ticket system?</title>
		<link>http://blog.softtester.com/index.php/2010/06/how-to-link-my-bug-reports-submissions-into-my-ticket-system/</link>
		<comments>http://blog.softtester.com/index.php/2010/06/how-to-link-my-bug-reports-submissions-into-my-ticket-system/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 17:48:24 +0000</pubDate>
		<dc:creator>Dipsy</dc:creator>
				<category><![CDATA[Tech Talk]]></category>

		<guid isPermaLink="false">http://blog.softtester.com/?p=643</guid>
		<description><![CDATA[Several years ago while my software wasn&#8217;t selling very well, I started to become very paranoid that my poor sales was due to bugs in my program. Bug that were hardly every reproduceable.  Over a year ago, I got some mturks to pinpoint some bugs. Which I believe, led to some of the major bugs [...]]]></description>
			<content:encoded><![CDATA[<p>Several years ago while my software wasn&#8217;t selling very well, I started to become very paranoid that my poor sales was due to bugs in my program. Bug that were hardly every reproduceable.  Over a year ago, I got some mturks to pinpoint some bugs. Which I believe, led to some of the major bugs being fixed.</p>
<p>However, I still get lots of bug reports where I can&#8217;t proceed any further. Theres two issues here. Firstly, that my bug reporting is super sensitive and produces reports when there isn&#8217;t actually a bug, although I&#8217;m not 100% why I get some of these reports.</p>
<p>Secondly, I&#8217;m wondering if I linked the reporting into my new ticket system and showed that I&#8217;m taking the problem seriously and asked for more information via the ticket system, whether people might provide more information.</p>
<p>by JM</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softtester.com/index.php/2010/06/how-to-link-my-bug-reports-submissions-into-my-ticket-system/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Tip for PAD file Submission</title>
		<link>http://blog.softtester.com/index.php/2010/05/tip-for-pad-file-submission/</link>
		<comments>http://blog.softtester.com/index.php/2010/05/tip-for-pad-file-submission/#comments</comments>
		<pubDate>Tue, 18 May 2010 10:50:14 +0000</pubDate>
		<dc:creator>MikeL</dc:creator>
				<category><![CDATA[New Software Releases]]></category>
		<category><![CDATA[Search Engine Optimisation]]></category>
		<category><![CDATA[Pad File]]></category>

		<guid isPermaLink="false">http://blog.softtester.com/?p=619</guid>
		<description><![CDATA[Quick Tip: To make the most of a PAD file submission, you need to make sure your up to date listing gets shown on the front page of the software download site where it gets most exposure. As a side effect this probably means most link juice flows through your listing and back to your [...]]]></description>
			<content:encoded><![CDATA[<p>Quick Tip: To make the most of a PAD file submission, you need to make sure your up to date listing gets shown on the front page of the software download site where it gets most exposure. As a side effect this probably means most link juice flows through your listing and back to your site via any links you get from the download site too <img src='http://blog.softtester.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>When you submit, make sure your software release date in the PAD file is the date of the day you actually do the submission. A lot of sites show recent submissions based on the release date in the PAD file rather than the actual date of submission, so submitting on the day of release maximises the chances of front page exposure.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softtester.com/index.php/2010/05/tip-for-pad-file-submission/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Goodbye to MDBSecure</title>
		<link>http://blog.softtester.com/index.php/2010/05/goodbye-to-mdbsecure/</link>
		<comments>http://blog.softtester.com/index.php/2010/05/goodbye-to-mdbsecure/#comments</comments>
		<pubDate>Sun, 16 May 2010 08:21:55 +0000</pubDate>
		<dc:creator>Dipsy</dc:creator>
				<category><![CDATA[Marketing]]></category>

		<guid isPermaLink="false">http://blog.softtester.com/?p=595</guid>
		<description><![CDATA[After much discussion  over the last year or two, I finally took the difficult decision to pull the plug on MDBSecure. I&#8217;ve just been removing the last of the web pages and email addresses etc. I first started development on the product back in 2005. The code to create an MS Access database which had [...]]]></description>
			<content:encoded><![CDATA[<p>After much discussion  over the last year or two, I finally took the difficult decision to pull the plug on MDBSecure. I&#8217;ve just been removing the last of the web pages and email addresses etc.</p>
<p>I first started development on the product back in 2005. The code to create an MS Access database which had security turned on is / was part of another product of mine. It made sense to put the functionality into a separate product.</p>
<p>Since then, I&#8217;ve improved the program and added extra functionality and a new website. However, as Microsoft drastically changed MS Access with version 2007 and added security, it was impossible to upgrade MDBSecure to cater for this new version.</p>
<p>Since, MDBSecure has become less popular as people are using the newer version of MS Access.</p>
<p>So it wasn&#8217;t worth the effort any more.</p>
<p>By JM</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softtester.com/index.php/2010/05/goodbye-to-mdbsecure/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Making an SEO difference with a lot of pages?</title>
		<link>http://blog.softtester.com/index.php/2010/05/making-an-seo-difference-with-a-lot-of-pages/</link>
		<comments>http://blog.softtester.com/index.php/2010/05/making-an-seo-difference-with-a-lot-of-pages/#comments</comments>
		<pubDate>Sat, 15 May 2010 09:59:34 +0000</pubDate>
		<dc:creator>Dipsy</dc:creator>
				<category><![CDATA[Search Engine Optimisation]]></category>

		<guid isPermaLink="false">http://blog.softtester.com/?p=592</guid>
		<description><![CDATA[We have a lot of product pages on one of our online stores, which has no meta keywords or description tags. Well, it uses the main page keywords and 35 chars of the start of the product description. I&#8217;ve found and modified some code which will scan a string and produce some keywords by order [...]]]></description>
			<content:encoded><![CDATA[<p>We have a lot of product pages on one of our online stores, which has no meta keywords or description tags. Well, it uses the main page keywords and 35 chars of the start of the product description.</p>
<p>I&#8217;ve found and modified some code which will scan a string and produce some keywords by order of density.  However, it would include words you would want include, like these them etc.  Although there is a feature to remove words added to a list, which I have added more words.  This would be a big task to go through and cherry pick words to add the list.</p>
<p>So my dilemma is, I could make a difference and add more words to the black list, use more of the product description in the meta description, but this would be a lot of work. Which could be better spent, hand crafting the meta tags and product description.</p>
<p>As there so many pages it will take forever to do anything which will make a difference from an <a href="http://blog.softtester.com/index.php/category/search-engine-optimisation/" >SEO</a> point of view.</p>
<p>Thoughts?</p>
<p>by JM</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softtester.com/index.php/2010/05/making-an-seo-difference-with-a-lot-of-pages/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

