open UIViewController from webView - uiwebview

I have an app which adds a webview as a subview of the main UIViewController. I want to intercept the links clicked in this webview and open them in a new UIViewController (as modal view or navigationController).
For this new UIViewController, i am using https://github.com/samvermette/SVWebViewController which is an inline browser class and works pretty well.
I am able to intercept clicks from that webview just fine in webView:shouldStartLoadWithRequest:navigationType. But my problem is that it is not able to open the new UIViewController (SVWebViewController). Following is the code to intercept clicks in the webView and open it :
- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
if(inType == UIWebViewNavigationTypeLinkClicked) {
NSURL *url = [inRequest URL];
NSString *fname = [url absoluteString];
SVWebViewController *webViewController = [[SVWebViewController alloc] initWithAddress:fname];
[self presentModalViewController:webViewController animated:YES];
[webViewController release];
return NO;
}
return YES;
}
There is no issue in SVWebViewController, it works fine when i call it from the main UIView but not when i use it to open clicks from the webView.
Thanks for your help!!

Related

How the detail view controller told the main controller about the changes made?

I'm reading the Big Nerd Ranch book and I'm at the 10th chapter about the navigation controller.
In the main controller, there is a TableView ( https://github.com/bignerdranch/iOS3eSolutions/blob/master/11.%20Homepwner/Homepwner/Homepwner/ItemsViewController.m ) where there are two methods that interact with the detail view :
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[self tableView] reloadData];
}
- (void)tableView:(UITableView *)aTableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *detailViewController = [[DetailViewController alloc] init];
NSArray *items = [[BNRItemStore sharedStore] allItems];
BNRItem *selectedItem = [items objectAtIndex:[indexPath row]];
// Give detail view controller a pointer to the item object in row
[detailViewController setItem:selectedItem];
// Push it onto the top of the navigation controller's stack
[[self navigationController] pushViewController:detailViewController
animated:YES];
}
In the detail view controller (https://github.com/bignerdranch/iOS3eSolutions/blob/master/11.%20Homepwner/Homepwner/Homepwner/DetailViewController.m), there is a method that "saves" the BNRItem being changed :
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// Clear first responder
[[self view] endEditing:YES];
// "Save" changes to item
[item setItemName:[nameField text]];
[item setSerialNumber:[serialNumberField text]];
[item setValueInDollars:[[valueField text] intValue]];
}
The code works well :
I understand how the main controller set the object to edit but I don't understand how the main view controller knows that the BNRItem has been changed and then set it back to the tableview ?
I was excepting the author to write a setter in the main controller (ItemsViewController.m ) that could be called by the detail view controller (DetailViewController.m) giving the new BNRItem.
But this part works "automatically".
Thank you.
As you are pointing to the same memory chunk in both controllers, changed made in the DetailViewController are obviously reported in ItemsViewController.m.

Monotouch - Popups over everything

On iPhone, in Xcode, I can show a popup view which overlays everything, including the Tab Bar, etc, by using code like this -
[[[[UIApplication sharedApplication] delegate] window] addSubview:mySpecialView];
I'm trying to do the same in MonoTouch, and the code I'm using is this -
UIApplication.SharedApplication.Delegate.Window.AddSubview(mySpecialView);
...but this crashes. Does anyone have any idea what I'm doing wrong?
Thanks for any help.
You did not say how it crashed - but I assume you're having a ModelNotImplementedException while using the Window property since it's not implemented by default (and is meant for storyboard).
You can either implement it to return the window field of the (autogenerated) AppDelegate (AppDelegate.cs file) or expose the same variable as a (static) field.
E.g. the default generated code
UIWindow window;
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
window = new UIWindow (UIScreen.MainScreen.Bounds);
window.RootViewController = new UINavigationController ();
window.MakeKeyAndVisible ();
return true;
}
would become:
static UIWindow window;
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
window = new UIWindow (UIScreen.MainScreen.Bounds);
window.RootViewController = new UINavigationController ();
window.MakeKeyAndVisible ();
return true;
}
static public UIWindow Window {
get { return window; }
}

IOS Modal View Controller Presents Black Screen

I am working on an IOS app and have been stumped by this problem for about a week now and cannot find a solution. Any help you can offer would be greatly appreciated. Here's my set-up:
I have a tab bar controller.
I have a TableViewController which has a navigation bar with a navigation item "Add".
After you press the "Add" selector I am modally presenting another viewController that has a picker on it.
I am using Core Data.
When the second view controller is modally presented it comes up with a black screen with a navigation bar. If I access the second view controller from an unrelated screen modally it comes up fine without the navigation bar.
No error message is logged, not even that the object wasn't saved when you press the "save" on the navigation bar. However, pressing "save" will bring you back to the TableViewController and it looks like the entity was added.
Here is the code in my TableViewController:
- (void)add:(id)sender {
SecondViewController *addController = [[SecondViewController alloc] init];
addController.delegate = self;
Entity *newEntity = [NSEntityDescription insertNewObjectForEntityForName:#"Entity" inManagedObjectContext:self.managedObjectContext];
addController.entity = newEntity;
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addController];
[self.navigationController presentModalViewController:navController animated:YES];
}
- (void)secondViewController:(SecondViewController *)secondViewController didAddEntity:(Entity *)entity {
if (entity) {
[self showEntity:entity animated:NO];
}
[self dismissModalViewControllerAnimated:YES];
}
- (void)showEntity:(Entity *)entity animated:(BOOL)animated {
EntityDetailTableViewController *detailViewController = [[EntityDetailTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
detailViewController.entity = entity;
[self.navigationController pushViewController:detailViewController animated:animated];
}
Here is the code in my second View Controller:
- (void) save {
entity.attribute = attributeTextField.text;
NSError *error = nil;
if (![entity.managedObjectContext save:&error])
{
NSLog(#"Problem saving attribute: %#", [error localizedDescription]);
}
NSLog(#"saveAttribute");
[self.delegate secondViewController:self didAddEntity:entity];
}
Any suggestions on where to go from here would be really helpful.
After much frustration I found the answer. If you are using storyboard you cannot navigate to the next view controller by the standard code. I put the prepareForSegue statement in my TableViewController.m file and then hooked up the connection on storyboard and identified the segue.
Now, when you press the Add button it segues to the new view controller screen and it's not black.
Here's a link to a useful tutorial
My guess is the way you are initializing is not right:
SecondViewController *addController = [[SecondViewController alloc] init];
should be initWithNIB:

UIWebView display problem

I followed this tutorial http://bytedissident.theconspiracy5.com/2010/11/24/uiwebview-tutorial/ and when I run the simulation in Xcode, all that is displayed is a blank white screen. I'm wondering what could be wrong. Is there some sort of code connection to the internet that i'm missing? I really don't know what could be wrong.
WebPageViewController.m
#import "WebPageViewController.h"
#implementation WebPageViewController
#synthesize wView;
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
//a URL string
NSString *urlAddress = #"http://www.nd.edu";
//create URL object from string
NSURL *url = [NSURL URLWithString:urlAddress];
//URL Request Object created from your URL object
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
//Load the request in the UIWebView
[wView loadRequest:requestObj];
//scale page to the device - can also be done in IB if preferred.
//wView.scalesPageToFit = YES;
}
Did you connect the .xib to the WebPageViewController class you created? You can check by selecting the .xib in the editor, and use identity inspector on 'File's Owner' in the Class field under Custom Class

How to determine if the user had clicked on a UIWebView

I need to get the url that a UIWebView is displaying after the user clicks on it once.
I've tried putting a button which calls a method which determines the url, under the UIWebView, but this way the button doesn't work. I've tried putting a button over a UIWebView but this way it gives not the url after the click, but the starting url.
Can you help me, please?
Thanks in advance!
The best way to know if somebody has clicked over your view is implementing touchesEnded method:
First declare a rect with the size of your webView in your viewDidLoad for example:
touchRect=CGRectMake(YourWebView.startPositionX, YourWebView.StartPositionY,YourWebView.width, YourWebView.height);
and then implement the touchesEnded:
(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
if(touch){
CGPoint location = [touch locationInView: [touch view]];
if (CGRectContainsPoint(touchRect, location)){
//do whatever
}
}
}
This way you will know if you have make a touch inside your webView.
To display the current location of UIWebView (location of main page):
NSURLRequest* webViewRequest = [myWebView request];
if (webViewRequest) {
NSURL* webViewURL = [webViewRequest URL];
NSString* webViewLocation = [webViewURL absoluteString];
}

Resources