Why does the pushViewController stop working when I remove a UIAlertView - objective-c

I outsourced some iPhone development and I am trying to make a simple change to the code, but it does not make any sense to me. I am hoping that someone can help me out. I would ask the original developer, but they just left for a week long vacation and I would prefer to not wait.
//
// SettingViewController.m
// FoodStorageManagement
//
// Created by Ryan McLaughlin on 10/20/11.
// Copyright 2011 Food Storage Management. All rights reserved.
//
#import "SettingViewController.h"
#import "MainViewController.h"
#import "XMLRPCRequest.h"
#import "XMLRPCResponse.h"
#import "XMLRPCConnection.h"
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonHMAC.h>
#implementation SettingViewController
#synthesize Obj_string,LoginState,hashkey,validuser,apikey,spinnerView;
-(id)init
{
[super init];
img_loginBg=[[UIImageView alloc]initWithImage:[UIImage imageNamed:#"Loginpage.png"]];
img_loginBg.frame=CGRectMake(0, 0, 320, 460);
app=[[UIApplication sharedApplication]delegate];
UserIDtxt=[[UITextField alloc]initWithFrame:CGRectMake(150, 163, 160, 25)];
UserIDtxt.returnKeyType=UIReturnKeyDone;
UserIDtxt.backgroundColor=[UIColor clearColor];
//UserIDtxt.text=#"user";
UserIDtxt.delegate=self;
UserIDtxt.tag=1;
pwdText=[[UITextField alloc]initWithFrame:CGRectMake(150, 220, 160, 25)];
pwdText.backgroundColor=[UIColor clearColor];
//pwdText.text=#"123456";
pwdText.secureTextEntry=YES;
pwdText.returnKeyType=UIReturnKeyDone;
pwdText.delegate=self;
pwdText.tag=2;
btn_SignUp=[UIButton buttonWithType:UIButtonTypeCustom];
btn_SignUp.frame=CGRectMake(45, 335, 95, 35);
btn_SignUp.backgroundColor=[UIColor clearColor];
[btn_SignUp setTitle:#"" forState:UIControlStateNormal];
[btn_SignUp addTarget:self action:#selector(ClickOnSignUp) forControlEvents:UIControlEventTouchUpInside];
[btn_SignUp retain];
btn_LogIn=[UIButton buttonWithType:UIButtonTypeCustom];
btn_LogIn.frame=CGRectMake(175, 335, 95, 35);
btn_LogIn.backgroundColor=[UIColor clearColor];
[btn_LogIn setTitle:#"" forState:UIControlStateNormal];
[btn_LogIn addTarget:self action:#selector(ClickOnLogIn) forControlEvents:UIControlEventTouchUpInside];
[btn_LogIn retain];
NSString *deviceVersion=[UIDevice currentDevice].systemVersion;
NSLog(#"%#",deviceVersion);
btn_Back=[UIButton buttonWithType:UIButtonTypeCustom];
btn_Back.frame=CGRectMake(8, 417, 50, 40);
btn_Back.backgroundColor=[UIColor clearColor];
[btn_Back setTitle:#"" forState:UIControlStateNormal];
[btn_Back addTarget:self action:#selector(ClickOnBack) forControlEvents:UIControlEventTouchUpInside];
[btn_Back retain];
return self;
}
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView
{
[super loadView];
[self.view addSubview:img_loginBg];
[self.view addSubview:btn_SignUp];
[self.view addSubview:btn_LogIn];
[self.view addSubview:btn_Back];
[self.view addSubview:UserIDtxt];
[self.view addSubview:pwdText];
}
-(void)ClickOnSignUp
{
Connection=[[NetworkConnection alloc]initConnection];
if (Connection.isReachable)
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:#"http://www.foodstoragemanagement.com/signup.php"]];
}
else
{
UIAlertView *LoginError=[[UIAlertView alloc]initWithTitle:#"Inventory" message:#"Network Connection unavailable.." delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginError show];
[LoginError release];
}
}
-(void) startSpinner:(NSString*)type andDisplay:(NSString*)display{
//remove any existing spinners at this point
if(self.spinnerView)
{
[self.spinnerView.view removeFromSuperview];
self.spinnerView = nil;
}
self.spinnerView =[[[SpinnerModal alloc]initWithType:type andDisplay:display]autorelease];
//add this to the root view of the app
//ViewManager *viewMgr = [ViewManager getManager];
[self.view addSubview:self.spinnerView.view];
}
-(void) stopSpinner{
NSLog(#"SPINNER IS REMOVED");
[self.spinnerView.view removeFromSuperview];
self.spinnerView = nil;
}
-(void)ClickOnLogIn
{
Connection=[[NetworkConnection alloc]initConnection];
if (Connection.isReachable)
{
[self startSpinner:#"spinner" andDisplay:#"Loading"];
timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:#selector(ClickOnLog) userInfo:nil repeats:NO];
}
else {
UIAlertView *LoginError=[[UIAlertView alloc]initWithTitle:#"Inventory" message:#"Network Connection unavailable.." delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginError show];
[LoginError release];
[self stopSpinner];
}
}
-(void)ClickOnLog
{
NSDate* now = [NSDate date];
NSString *dateString=[[NSString alloc]init];
dateString = [now description];
dateString=[self dateInFormat:#"%s"];
NSString *username=[UserIDtxt.text lowercaseString];
NSString *username_reverse=[username reverseString];
NSString *password_hash=[self sha256:pwdText.text];
NSString *str=[NSString stringWithFormat:#"%#%#%#",username,password_hash,dateString];
str=[self sha256:str];
app.username=[NSMutableString stringWithString:username];
app.password=[NSMutableString stringWithString:password_hash];
//url from plist
NSString *server=[[NSString alloc]init];
NSString *path = [[NSBundle mainBundle] pathForResource:#"Config" ofType:#"plist"];
NSMutableDictionary *plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
server=[plistDict objectForKey:#"NewUrl"];
XMLRPCRequest *reqHello = [[XMLRPCRequest alloc] initWithHost:[NSURL URLWithString:server]];
NSMutableDictionary *dict=[[NSMutableDictionary alloc]init];
[dict setValue:[UserIDtxt.text lowercaseString] forKey:#"username"];
[dict setValue:str forKey:#"hash_key"];
[dict setValue:dateString forKey:#"timestamp"];
[reqHello setMethod:#"user.get_api" withObjects:[NSArray arrayWithObjects:dict,nil]];
NSString *result=[self executeXMLRPCRequest:reqHello];
if ([result length]>0)
{
NSLog(#"OUTPUT %#",result);
NSData* data=[result dataUsingEncoding:NSUTF8StringEncoding];
NSXMLParser *parser1=[[NSXMLParser alloc]initWithData:data];
[parser1 setDelegate:self];
[parser1 parse];
[reqHello release];
defaults = [NSUserDefaults standardUserDefaults];
app.defaultuser=[NSUserDefaults standardUserDefaults];
[defaults setObject: app.globalApi_key forKey: #"api_key"];
[defaults setObject:UserIDtxt.text forKey:#"username"];
[defaults setObject:pwdText.text forKey:#"password"];
app.defaultuser=defaults;
if (!app.globalApi_key)
{
defaults = [NSUserDefaults standardUserDefaults];
}
[defaults synchronize];
if (!val)
{
val=[defaults objectForKey:#"api_key"];
}
}
else
{
UIAlertView *LoginError=[[UIAlertView alloc]initWithTitle:#"Inventory" message:#"Unable to communicate with the server" delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginError show];
[LoginError release];
}
if( ![result isKindOfClass:[NSString class]] )//error occured
{
UIAlertView *LoginError=[[UIAlertView alloc]initWithTitle:#"Inventory" message:#"unable to communicate with server" delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginError show];
[LoginError release];
}
else
{
if ([self.validuser isEqualToString:#"Authenticated Successfully"])
{
if (app.Authorisation==TRUE)
{
UIAlertView *LoginOK=[[UIAlertView alloc]initWithTitle:#"Authentication" message:#"Authenticated successfully!!!" delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginOK show];
[LoginOK release];
}
else
{
MainViewController *main=[[MainViewController alloc]init];
[self.navigationController pushViewController:main animated:YES];
[main release];
}
}
else
{
UIAlertView *LoginError=[[UIAlertView alloc]initWithTitle:#"Authentication" message:self.validuser delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginError show];
[LoginError release];
}
}
[self stopSpinner];
}
- (void)alertView:(UIAlertView *)ConfirmationAlert didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if([ConfirmationAlert.title isEqualToString:#"Authentication"])
{
[self dismissModalViewControllerAnimated:YES];
app.Authorisation=FALSE;
}
}
# pragma mark Parsing Delegate Methods
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:#"params"])
{
Obj_string = [[NSMutableString alloc]init];
LoginState =[[NSMutableString alloc]init];
hashkey=[[NSMutableString alloc]init];
validuser=[[NSMutableString alloc]init];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if([elementName isEqualToString:#"name"])
{
self.LoginState=self.Obj_string;
}
else if([elementName isEqualToString:#"string"])
{
//NSLog(#"%#",Obj_string);
if([self.LoginState isEqualToString:#"hash_key"])
{
self.hashkey=self.Obj_string;
app.globalhash_key=self.hashkey;
}
if([self.LoginState isEqualToString:#"api"])
{
self.apikey=self.Obj_string;
app.globalApi_key=self.apikey;
}
if([self.LoginState isEqualToString:#"message"])
{
self.validuser=self.Obj_string;
}
}
[Obj_string release];
Obj_string = nil;
Obj_string = [[NSMutableString alloc]init];
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
[Obj_string appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
//[LoginState appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
}
-(NSString *)dateInFormat:(NSString*)stringFormat {
char buffer[80];
const char *format = [stringFormat UTF8String];
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer, 80, format, timeinfo);
return [NSString stringWithCString:buffer encoding:NSUTF8StringEncoding];
}
- (NSString *)sha256:(NSString *)str
{
const char *inputString = [str UTF8String];
unsigned char hashedChars[32]; // 32bit encoding
//unsigned char hashedChars[64]; // 64 bit encoding
//unsigned char hashedChars[64]; //16 bit encoding
CC_SHA256(inputString , strlen(inputString), hashedChars);
NSData *hashedData = [NSData dataWithBytes:hashedChars length:32];//32bit encoding
//NSData *hashedData = [NSData dataWithBytes:hashedChars length:64]; //64bit encoding
//NSData *hashedData = [NSData dataWithBytes:hashedChars length:16]; //16bit encoding
NSLog(#"hashedData = %#", hashedData);
NSString *someString = [NSString stringWithFormat:#"%#", hashedData];
someString = [someString stringByReplacingOccurrencesOfString:#" " withString:#""];
someString = [someString stringByReplacingOccurrencesOfString:#"<" withString:#""];
someString = [someString stringByReplacingOccurrencesOfString:#">" withString:#""];
//return hash;
return someString;
}
- (NSString *)getMD5FromString:(NSString *)source
{
const char *src = [source UTF8String];
unsigned char result[16];
CC_MD5(src, strlen(src), result);
NSString *ret = [[[NSString alloc] initWithFormat:#"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
] autorelease];
return [ret lowercaseString];
}
- (id)executeXMLRPCRequest:(XMLRPCRequest *)req
{
XMLRPCResponse *userInfoResponse = [XMLRPCConnection sendSynchronousXMLRPCRequest:req];
return [userInfoResponse object];
}
-(void)ClickOnBack
{
[self dismissModalViewControllerAnimated:YES];
//[self.navigationController popViewControllerAnimated:YES];
//MainViewController *mainView=[[MainViewController alloc]init];
// [self.navigationController popToViewController:mainView animated:YES];
}
-(BOOL)textFieldShouldReturn:(UITextField*)textField;
{
NSInteger nextTag = textField.tag + 1;
// Try to find next responder
UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
if (nextResponder) {
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
} else {
// Not found, so remove keyboard.
[textField resignFirstResponder];
}
return NO; // We do not want UITextField to insert line-breaks.
}
-(NSString*) digest:(NSString*)input
{
NSData *data = [input dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
// uint8_t digest[CC_SHA1_DIGEST_LENGTH];
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA1(data.bytes, data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
// for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++)
[output appendFormat:#"%02x", digest[i]];
return output;
}
/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
}
*/
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
#end
The part in question is this
if ([self.validuser isEqualToString:#"Authenticated Successfully"])
{
if (app.Authorisation==TRUE)
{
UIAlertView *LoginOK=[[UIAlertView alloc]initWithTitle:#"Authentication" message:#"Authenticated successfully!!!" delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginOK show];
[LoginOK release];
}
else
{
MainViewController *main=[[MainViewController alloc]init];
[self.navigationController pushViewController:main animated:YES];
[main release];
}
}
else
{
UIAlertView *LoginError=[[UIAlertView alloc]initWithTitle:#"Authentication" message:self.validuser delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginError show];
[LoginError release];
}
}
On the surface it seems really simple. The change I want to make is to remove this alert
UIAlertView *LoginOK=[[UIAlertView alloc]initWithTitle:#"Authentication" message:#"Authenticated successfully!!!" delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginOK show];
[LoginOK release];
However, any change to the alert causes the pushViewController to stop working. I have tried commenting the alert out,
if ([self.validuser isEqualToString:#"Authenticated Successfully"])
{
if (app.Authorisation==TRUE)
{
// UIAlertView *LoginOK=[[UIAlertView alloc]initWithTitle:#"Authentication" message:#"Authenticated successfully!!!" delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
//[LoginOK show];
//[LoginOK release];
}
else
{
MainViewController *main=[[MainViewController alloc]init];
[self.navigationController pushViewController:main animated:YES];
[main release];
}
}
else
{
UIAlertView *LoginError=[[UIAlertView alloc]initWithTitle:#"Authentication" message:self.validuser delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginError show];
[LoginError release];
}
}
I have tried rewriting the second if
if ([self.validuser isEqualToString:#"Authenticated Successfully"])
{
if (app.Authorisation==FALSE)
{
MainViewController *main=[[MainViewController alloc]init];
[self.navigationController pushViewController:main animated:YES];
[main release];
}
}
else
{
UIAlertView *LoginError=[[UIAlertView alloc]initWithTitle:#"Authentication" message:self.validuser delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginError show];
[LoginError release];
}
}
I have also tried completely removing the second if
if ([self.validuser isEqualToString:#"Authenticated Successfully"])
{
MainViewController *main=[[MainViewController alloc]init];
[self.navigationController pushViewController:main animated:YES];
[main release];
}
else
{
UIAlertView *LoginError=[[UIAlertView alloc]initWithTitle:#"Authentication" message:self.validuser delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginError show];
[LoginError release];
}
}
But the pushViewController will not work unless I have the alert in the code. I don't get any error, and the app does not crash, it just stays in the current page, so I am completely at a loss. It makes me think their is some action that is triggered by clicking "OK" in the alert, but I don't see anything in the code.
I have also stepped through the code to see if I can spot the problem but it seems fine.
In case it matters I am using xcode 4.2 and iOS 5 sdk.
Another strange occurance is that if I run the code like this
if ([self.validuser isEqualToString:#"Authenticated Successfully"])
{
MainViewController *main=[[MainViewController alloc]init];
[self.navigationController pushViewController:main animated:YES];
[main release];
}
else
{
UIAlertView *LoginError=[[UIAlertView alloc]initWithTitle:#"Authentication" message:self.validuser delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginError show];
[LoginError release];
}
and I get a login error (meaning it triggers the alert in the else). Then after clicking ok it moves on to the next page. I really don't understand how this could happen since they are in different part of the if. I must be missing something obvious.

The Uialertview delegate method never gets called, therefore never dismisses the modal view controller
- (void)alertView:(UIAlertView *)ConfirmationAlert didDismissWithButtonIndex:(NSInteger)buttonIndex
Just dismiss the view controller next to the commented code
[self dismissModalViewControllerAnimated:YES];
app.Authorisation=FALSE;

I may be totally off base here, but did you try removing the entire block;
if (app.Authorisation==TRUE)
{ ***STARTING HERE
UIAlertView *LoginOK=[[UIAlertView alloc]initWithTitle:#"Authentication" message:#"Authenticated successfully!!!" delegate:self cancelButtonTitle:#"OK" otherButtonTitles:nil];
[LoginOK show];
[LoginOK release];
}
else
{
MainViewController *main=[[MainViewController alloc]init];
[self.navigationController pushViewController:main animated:YES];
[main release];
} ***ENDING HERE
}

If you remove the alert then the delegate methods won't be called.
This part here:
- (void)alertView:(UIAlertView *)ConfirmationAlert didDismissWithButtonIndex:(NSInteger)buttonIndex {
if([ConfirmationAlert.title isEqualToString:#"Authentication"]) {
[self dismissModalViewControllerAnimated:YES];
app.Authorisation=FALSE;
}
}
Just put the code inside the if-block above into the block where you removed the alert.

Related

Xcode 6.1.1 iOS simulator error: -[Purchase superview]: unrecognized selector sent to instance

I am developing an iOS app using Xcode 6.1.1. When I press a button on my main ViewController, “ViewController”, it is supposed to modal segue to a second, “Purchase”. However, the app crashes on the iOS simulator. I have tried cleaning my project, restarting Xcode, and deleting non-existent connections in the .storyboard. However, nothing seems to work. Also, "All Exceptions" in the breakpoints are turned on. Here is the code for Purchase.m:
#import "Introduction.h"
#import "Purchase.h"
#define ProductID = “IAP_ID"
#interface Purchase ()
#end
#implementation Purchase
- (void)viewDidLoad
{
[super viewDidLoad];
// Adding activity indicator
activityIndicatorView = [[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activityIndicatorView.center = self.view.center;
[activityIndicatorView hidesWhenStopped];
[self.view addSubview:activityIndicatorView];
[activityIndicatorView startAnimating];
//Hide purchase button initially
purchaseButton.hidden = YES;
[self fetchAvailableProducts];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)fetchAvailableProducts{
NSSet *productIdentifiers = [NSSet
setWithObjects:#“IAP_ID",nil];
productsRequest = [[SKProductsRequest alloc]
initWithProductIdentifiers:productIdentifiers];
productsRequest.delegate = self;
[productsRequest start];
}
- (BOOL)canMakePurchases
{
return [SKPaymentQueue canMakePayments];
}
- (void)purchaseMyProduct:(SKProduct*)product{
if ([self canMakePurchases]) {
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
else{
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
#"Purchases are disabled in your device" message:nil delegate:
self cancelButtonTitle:#"Ok" otherButtonTitles: nil];
[alertView show];
}
}
-(IBAction)purchase:(id)sender{
[self purchaseMyProduct:[validProducts objectAtIndex:0]];
purchaseButton.enabled = NO;
}
#pragma mark StoreKit Delegate
-(void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
NSLog(#"Purchasing");
break;
case SKPaymentTransactionStatePurchased:
if ([transaction.payment.productIdentifier
isEqualToString:#"9plus10equals21"]) {
NSLog(#"Purchased ");
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:
#"Purchase is completed succesfully" message:nil delegate:
self cancelButtonTitle:#"Ok" otherButtonTitles: nil];
[alertView show];
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
NSLog(#"Restored ");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
NSLog(#"Purchase failed ");
break;
default:
break;
}
}
}
-(void)productsRequest:(SKProductsRequest *)request
didReceiveResponse:(SKProductsResponse *)response
{
SKProduct *validProduct = nil;
int count = [response.products count];
if (count>0) {
validProducts = response.products;
validProduct = [response.products objectAtIndex:0];
if ([validProduct.productIdentifier
isEqualToString:#“IAP_ID"]) {
[productTitleLabel setText:[NSString stringWithFormat:
#"Product Title: %#",validProduct.localizedTitle]];
[productDescriptionLabel setText:[NSString stringWithFormat:
#"Product Desc: %#",validProduct.localizedDescription]];
[productPriceLabel setText:[NSString stringWithFormat:
#"Product Price: %#",validProduct.price]];
}
} else {
UIAlertView *tmp = [[UIAlertView alloc]
initWithTitle:#"Not Available"
message:#"No products to purchase"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:#"Ok", nil];
[tmp show];
}
[activityIndicatorView stopAnimating];
purchaseButton.hidden = NO;
}
#end
Here is the error message:
2015-03-01 11:58:00.460 Phone hack prank [7758:357987] [RevMob] Starting RevMobAds
2015-03-01 11:58:01.481 Phone hack prank [7758:357987] Session started with block
2015-03-01 11:58:01.481 Phone hack prank [7758:357987] [RevMob] Initializating Banner.
2015-03-01 11:58:01.481 Phone hack prank [7758:357987] [RevMob] Requesting banner data.
2015-03-01 11:58:02.638 Phone hack prank [7758:357987] -[Purchase superview]: unrecognized selector sent to instance 0x7a177c70
(lldb)

MFMessageComposeViewController - Getting stuck after sending SMS in ios7

After sending SMS from my phone(it's working properly) in my project using the MFMessageComposeViewController I can't get back to the app or press cancel. Instead I'm stuck in Apple SMS interface and I can't do anything else then to restart the app. Do I miss something in didFinishWithResult or could it be something else? Thanks
- (IBAction)sendSMS:(id)sender {
MFMessageComposeViewController *controller =
[[[MFMessageComposeViewController alloc] init] autorelease];
if([MFMessageComposeViewController canSendText])
{
NSString *str= #"Hi";
controller.body = str;
controller.recipients = [NSArray arrayWithObjects:
#"", nil];
controller.delegate = self;
[self dismissViewControllerAnimated:YES
completion:nil];
[self presentViewController:controller animated:YES completion:nil];
}
}
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult) result
{
switch (result) {
case MessageComposeResultCancelled:
break;
case MessageComposeResultFailed:
{
UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:#"Error" message:#"Failed to send SMS!" delegate:nil cancelButtonTitle:#"OK" otherButtonTitles:nil];
[warningAlert show];
break;
}
case MessageComposeResultSent:
break;
default:
break;
}
[self dismissViewControllerAnimated:YES completion:nil];
}

how to create any UIViewController from NSString name dynamically iOS7.1

I want to create a UIViewController from NSString Name (buttonSelected.viewControllerID), considering class name is the same than storyboardIdentifier how to do that???, currently I have following code for two viewControllers, but I only want to have it in one shot
if ([buttonSelected.typeOfContent isEqualToString:#"AtencionClienteDetalleVC"]) {
if ([[functions removeBlanksFromString:buttonSelected.viewControllerID] isEqualToString:#""]) {
[[[UIAlertView alloc] initWithTitle:#"Notification"
message:[NSString stringWithFormat:#"screen destination must not be empty"]
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles:nil] show];
}
else{
AtencionClienteDetalleVC *viewController = [self.storyboard instantiateViewControllerWithIdentifier:buttonSelected.viewControllerID];
viewController.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:LOGO_COMPANY]];
viewController.itemsCatalog = buttonSelected.viewControllerParameters;
[self.navigationController pushViewController:viewController animated:YES];
}
return;
}
if ([buttonSelected.typeOfContent isEqualToString:#"ListadoVideos"]) {
if ([[functions removeBlanksFromString:buttonSelected.viewControllerID] isEqualToString:#""]) {
[[[UIAlertView alloc] initWithTitle:#"Notification"
message:[NSString stringWithFormat:#"screen destination must not be empty"]
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles:nil] show];
}
else{
ListadoVideos *viewController = [self.storyboard instantiateViewControllerWithIdentifier:buttonSelected.viewControllerID];
viewController.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:LOGO_COMPANY]];
viewController.itemsCatalog = buttonSelected.viewControllerParameters;
[self.navigationController pushViewController:viewController animated:YES];
}
return;
}
just need to set all your buttonSelected.typeOfContent to "ViewController" and then replace your current code for this:
if ([buttonSelected.typeOfContent isEqualToString:#"ViewController"]) {
if ([[functions removeBlanksFromString:buttonSelected.viewControllerID] isEqualToString:#""]) {
[[[UIAlertView alloc] initWithTitle:#"Notification"
message:[NSString stringWithFormat:#"screen destination must not be empty"]
delegate:nil
cancelButtonTitle:#"OK"
otherButtonTitles:nil] show];
}
else{
NSString *myUIViewControllerClassName = buttonSelected.viewControllerID;
Class myClass = NSClassFromString(myUIViewControllerClassName);
NSObject *myObject = [myClass new];
if( [myObject isKindOfClass:[UIViewController class]] ){
UIViewController *rightViewController = (UIViewController *) myObject;
rightViewController = [self.storyboard instantiateViewControllerWithIdentifier:myUIViewControllerClassName];
rightViewController.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:LOGO_COMPANY]];
[self.navigationController pushViewController:rightViewController animated:YES];
}
}
return;
}

iOS: Image Will Not Delete From Array

I'm working on an app that behaves like a photo gallery, and I'm implementing the option to have the user delete photos from their gallery. To accomplish this, I decided to place an invisible button over each picture. When the user hits an "Edit" button, the hidden delete buttons over each picture become active. I'm using the same IBOutlet over each of the hidden buttons for simplicity, and I've tagged each button appropriately in Interface Builder. When the user taps the button over the picture, an alert view appears asking if they really want to delete it. If they click yes, I call removeObjectAtIndex. Here is the code I'm using:
- (IBAction)deleteButtonPressed:(id)sender {
NSLog(#"Sender is %#", sender);
UIAlertView *deleteAlertView = [[UIAlertView alloc] initWithTitle:#"Delete"
message:#"Are you sure you want to delete this photo?"
delegate:self
cancelButtonTitle:#"No"
otherButtonTitles:#"Yes", nil];
[deleteAlertView show];
int imageIndex = ((UIButton *)sender).tag;
deleteAlertView.tag = imageIndex;
}
- (void)alertView: (UIAlertView *) alertView
clickedButtonAtIndex: (NSInteger) buttonIndex
{
if (buttonIndex != [alertView cancelButtonIndex]) {
NSLog(#"User Clicked Yes.");
[self.array removeObjectAtIndex: alertView.tag];
}
[self.user setObject:array forKey:#"images"];
}
The issue here is that when I click "Yes" in the alert view, nothing happens. However, if I tap on the image and click "Yes" a second time, the app crashes, and the debug states:
Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray removeObjectAtIndex:]: index (0) beyond bounds (0)' So, I'm not sure where to go from here, I'm still very new to programming and everything looks correct to me. Any help is much appreciated, thanks!
Here is how I add them into the array:
////start of saving////
- (void)viewWillAppear:(BOOL)animated
{
self.user = [NSUserDefaults standardUserDefaults];
self.array = [[self.user objectForKey:#"images"]mutableCopy];
while(self.array == nil)
{
[self.user setObject:[NSMutableArray arrayWithObject:#""] forKey:#"images"];
self.array = [[self.user objectForKey:#"images"]mutableCopy];
NSLog(#"%#",#"attempting to create an array to store the images in");
}
}
- (void)applicationDidEnterBackground:(UIApplication*)application {
NSLog(#"Image on didenterbackground: %#", imageView);
self.array = [NSMutableArray arrayWithObject:[NSData dataWithData:UIImagePNGRepresentation(imageView.image)]];
[self.array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView2.image)]];
[self.array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView3.image)]];
[self.array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView4.image)]];
[self.array addObject:[NSData dataWithData:UIImagePNGRepresentation(imageView5.image)]];
[self.user setObject:self.array forKey:#"images"];
[user synchronize];
}
- (void)viewDidLoad
{
self.user = [NSUserDefaults standardUserDefaults];
NSLog(#"It is %#", self.user);
self.array = [[self.user objectForKey:#"images"]mutableCopy];
imageView.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:0]];
imageView2.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:1]];
imageView3.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:2]];
imageView4.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:3]];
imageView5.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:4]];
imageView6.image = [[UIImage alloc] initWithData:[self.array objectAtIndex:5]];
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:#selector(applicationDidEnterBackground:)
name:UIApplicationDidEnterBackgroundNotification
object:app];
backToGalleryButton.hidden = YES;
tapToDeleteLabel.hidden = YES;
deleteButton1.hidden = YES;
[super viewDidLoad];
}
- (void)viewDidUnload
{
self.user = nil;
}
////end of saving
///// shows the hidden and invisible "delete" button over each photo.
- (IBAction)editButtonPressed:(id)sender {
grabButton.hidden = YES;
editButton.hidden = YES;
backToGalleryButton.hidden = NO;
tapToDeleteLabel.hidden = NO;
deleteButton1.hidden = NO;
}
- (IBAction)deleteButtonPressed:(id)sender {
NSLog(#"Sender is %#", sender);
UIAlertView *deleteAlertView = [[UIAlertView alloc] initWithTitle:#"Delete"
message:#"Are you sure you want to delete this photo?"
delegate:self
cancelButtonTitle:#"No"
otherButtonTitles:#"Yes", nil];
[deleteAlertView show];
int imageIndex = ((UIButton *)sender).tag;
deleteAlertView.tag = imageIndex;
}
- (void)alertView: (UIAlertView *) alertView
clickedButtonAtIndex: (NSInteger) buttonIndex
{
if (buttonIndex != [alertView cancelButtonIndex]) {
NSLog(#"User Clicked Yes.");
NSLog(#"Array: %#, index: %d", self.array, alertView.tag);
[self.array removeObjectAtIndex: alertView.tag];
}
[self.user setObject:array forKey:#"images"];
}
#end
EDIT: This is the code I use to put the objects into the UIImageView from the users camera roll:
- (IBAction)grabImage {
self.imgPicker = [[UIImagePickerController alloc] init];
self.imgPicker.delegate = self;
self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
_popover = [[UIPopoverController alloc] initWithContentViewController:imgPicker];
[_popover presentPopoverFromRect:self.imageView.bounds inView:self.imageView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
else {
[self presentModalViewController:imgPicker animated:YES];
}
[self.imgPicker resignFirstResponder];
}
// Sets the image in the UIImageView
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {
if (imageView.image == nil) {
imageView.image = img;
[picker dismissModalViewControllerAnimated:YES];
[self.popover dismissPopoverAnimated:YES];
return;
}
if (imageView2.image == nil) {
imageView2.image = img;
[picker dismissModalViewControllerAnimated:YES];
[self.popover dismissPopoverAnimated:YES];
return;
}
if (imageView3.image == nil) {
imageView3.image = img;
[picker dismissModalViewControllerAnimated:YES];
[self.popover dismissPopoverAnimated:YES];
return;
}
if (imageView4.image == nil) {
imageView4.image = img;
[picker dismissModalViewControllerAnimated:YES];
[self.popover dismissPopoverAnimated:YES];
return;
}
}
When I added NSLog(#"Array: %#, index: %d", self.array, alertView.tag); just before removeAtIndex the console says 2012-04-03 18:39:39.066 AppName[1631:f803] Array: (null), index: 0. Could that be the cause? I'm not sure why it would be, I think the code looks fine.
Removing the image from the array is not the only step you have to take. Your code is correct for removing the image from the array, which is why you get image out of bounds the second time, but you also need to remove the image from the UI so the user can no longer delete an image that is not there.
There are many oddities with this code but I think the problem is that you are not calling super on your viewwillappear and viewdidload functions. I would get rid of your viewWillAppear method as it serves no purpose.

Unable to handle setEditing method through UIBarButtonItem

I have added a bar button item in my tool bar and I implemented its functionality in the method given below. I am not able, however, to display a delete button in each row. How can I do this?
-(void)setEditing:(BOOL)editing
animated:(BOOL)animated
{
[super setEditing:editing
animated:animated];
[editButton setEnabled:!editing];
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSString *selectedFile = (NSString*) [directoryContents objectAtIndex: indexPath.row];
NSString *selectedPath = [directoryPath stringByAppendingPathComponent:selectedFile];
BOOL canWrite = [[NSFileManager defaultManager] isWritableFileAtPath:selectedPath];
if(!canWrite)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:#"status"
message:#"path isnt writable"
delegate:nil
cancelButtonTitle:#"cancel"
otherButtonTitles:nil];
[alert show];
[alert release];
}
NSError *err = nil;
if(! [[NSFileManager defaultManager] removeItemAtPath:selectedPath error:&err])
{
UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:#"status"
message:#"cannot delete"
delegate:nil
cancelButtonTitle:#"cancel"
otherButtonTitles:nil];
[alert1 show];
[alert1 release];
}
// Delete the row from the data source.
NSArray *deletedPaths = [NSArray arrayWithObject: indexPath];
[self loadDirectoryContents];
[self.tableview deleteRowsAtIndexPaths:deletedPaths withRowAnimation:YES];
}
}
The button on the toolbar will need to be connected to an interface action in the custom table view controller subclass. Define the action as follows -
- (IBAction)startEditing {
[self setEditing:YES animated:YES];
}
-(void)setEditing:(BOOL)editing
animated:(BOOL)animated
{
[super setEditing:editing
animated:animated];
[editButton setEnabled:!editing];
}
You will have to implement the delegate method tableView:editingStyleForRowAtIndexPath and return UITableViewCellEditingStyleDelete for the rows you wish to enable it.