UItextView Delegate methods not called inside subview - iphone

In brief:
In ClassA_VC I do:
ClassB_VC *classB_VC=[ClassB_VC alloc]initWithNibName:#"ClassB_VC" bundle:nil];
[self.view addSubview:classB_VC.view];
Then in ClassB_VC I have an UITextField. I set the delegate connection between textfield and File's owner in IB, I added in #interface declaration and I wrote the protocol methods (textFieldDidEndEditing, textFieldDidBeginEditing, etc...) as usual.
This should work but I got an Exception when I touch the textfield. It seems textfield is not reaching its delegate.
However, if I present the view using presentModalViewController, everything works fine. I'd prefer not having to do it so because these views are into a tabViewController and I'd like not hiding the tabBar when showing.
I hope you understand what I'm trying to say. My english is not very good.

Have you retain ClassB_VC in ClassA_VC?

remove the delegate from interface builder and do this :
ClassB_VC *classB_VC=[ClassB_VC alloc]initWithNibName:#"ClassB_VC" bundle:nil];
[classB_VC.yourTextField setDelegate:classB_VC];
[self.view addSubview:classB_VC.view];
Let me know if it helps

Related

Set the Delegate on SubView

I have a splitViewController that has a master and detail view controllers. The code below is from the master and it creates the new view in the detail:
UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:[NSString stringWithFormat:#"%#",[self.defaultSettingsMenuItems objectAtIndex:indexPath.row]]];
[self.detailViewController.view addSubview:controller.view];
detailViewController is a global instance of DetailViewController. In the detailViewController, I have many textFields and need to utilize the UITExtFieldDelegate. However, I think that the detailViewController isn't self at that point, and that's why I'm getting EXC_BAD_ACCESS errors on using the TextFieldDelegate methods in detailViewController.
EDIT: I have now found that the subView delegate methods only work for the viewController I setup as the rootViewCOntroller relationship from within Storyboard. Ex. If I have 6 views in the default menu settings above, whichever one I have setup as the first and root view in storyboard will work correctly. Any and all other subviews shown (from making a new selection in the master view) will not work properly. I think this will help diagnose the problem.
I am not familiar with storyboards, but I don't see you setting the detailViewController's delegate anywhere. You probably need to have something like self.detailViewController.delegate = self; somewhere before you yield control over to the subview.
This all I needed, the second line:
UIViewController *viewController= [self.detailViewController.storyboard instantiateViewControllerWithIdentifier:[NSString stringWithFormat:#"%#",[self.defaultSettingsMenuItems objectAtIndex:indexPath.row]]];
if (self.detailViewController.childViewControllers.count >= 1) {
NSLog(#"childViewControllers: %#",self.detailViewController.childViewControllers);
[[self.detailViewController.childViewControllers objectAtIndex:0] removeFromParentViewController];
}
[self.detailViewController addChildViewController:viewController];
[self.detailViewController.view addSubview:viewController.view];
EDIT: I've updated my answer with the if look to remove viewControllers from the stack. Slightly hacky, but functional.

Help Menu iPhone

I have a design question/technical question about my iPhone app.
I have a pretty simple (read really really simple) single view application. And it does everything that I need it to do. However I find myself in need of a help view. And I really don't quite know what to do!
I have a simple helpButton() method in my main view controller, and I really just want to display a scrollview with a bunch of images that show what to do during the use of my app. However, should I make a new viewcontroller class? How do I call it from my method?
Really I was thinking of an unfortunately simple method, just putting a scrollview behind everything and hiding it. Then showing it when the IBAction is called. Horrible...
Sorry if this is elementary, I haven't needed to do anything more yet!
You can push a modalViewController. To do that just make a new viewController with the scrollview and associated data in it, then
MyViewController *myViewController = [[MyViewController alloc] init];
[self presentModalViewController:myViewController animated:YES];
Create an IBAction in your new viewController and a hooked up button to that action to dismiss the modalView (something like this:
IBAction done {
[self dismissModalViewControllerAnimated:YES];
}
A couple options:
1) Create a new UIView object, either programmatically, or even in your existing XIB file. Use the [self.view addSubview:view] method to display it.
2) Create a new UIViewController with its own XIB file. Use [self presentModalViewController:anaimated:] to display it.
Either way, you'll need to add something to the new view to dismiss it when you're done.

UIViewTableCell didSelectRowAtIndexPath is calling but not pushing a view controller

so im having a UIViewController view with a UITableView.
So the UIViewController class name is SelectionScreen.
The UITableView class name is SelectionScreenTable.
Picture:
http://img717.imageshack.us/i/screenshot20100609atpm0.png/
I have declared a UITableView *selectionTable in SelectionScreen class and connected it to the xib file of the SelectionScreen
what the problem is , is that when i click a row in the table,it stays selected as highlighted blue, it calls the didSelectRowAtIndexPath (checked with NSLog) but not pushing a new view which is called(GraphView).
This is the code which i use to call the new controller WHICH WORKS with a normal button
GraphView *aSelectionScreenViewController = [[GraphView alloc]
initWithNibName:#"GraphView"
bundle:nil];
[self presentModalViewController:aSelectionScreenViewController animated: YES];
[aSelectionScreenViewController release];
I searched around and found that I need to set a delegate for the table in the UITableView class itself on the viewload
tableview.delegate = self;
or
self.tableview.delegate = self;
But it was not working. the controller was still not being pushed, and yes i have checked the controller is not nil as i tried it with a simple button.
So i was thinking whether i should set the delegate of the UITableView at the UIViewController instead, so i tried this code
selectionTable.delegate = selectionTable.self;
but obviously it did not work =\, it messed up the whole UITableView and caused all the cells to be its predefined settings.
So does anybody have any idea on how i can get it to work.
It's a bit hard to get the full picture here, but I can try some hints.
The outlets seem to be correctly connected from the screenshot, although Selection Screen Table could probably be called Selection Screen Table Controller and the class name should be SelectionScreenTableController for less confusion.
I think the problem could be that the method presentModalViewController: must be called on an active view controller to work.
From what I can tell you have three view controllers, a SelectionScreenTableController, a GraphViewController, and then there must also be some kind of main controller, probably SelectionScreenController.
The SelectionScreenController is the active view controller, so that must be the one to have sent the presentModalViewController: message.
There are several ways you could solve this. The quick fix would be to make an outlet in SelectionScreenTableController called selectionScreenController and link it to File's Owner in the nib file (assuming your SelectionScreen class is in fact a view controller), then call:
[selectionScreenController
presentModalViewController:aSelectionScreenViewController
animated: YES];
instead in your current listing of didSelectRowAtIndexPath:
Hey guys, i solved it, in the screenshot
http://img717.imageshack.us/i/screenshot20100609atpm0.png/
The SelectionScreenTable controller in the XIB of SelectionScreen, the view outlet was not connected to the XIB in the SelectionScreen XIB, so i guess it wasn't properly configured.
i solved it instead of using
presentModalViewController.
i used an animation to bring in the view instead
More info in the link below
http://www.iphonedevsdk.com/forum/iphone-sdk-development/13427-uiview-slide-transition.html

UIView subviews don't responde to delegates

I have following code in viewDidLoad
myViewController = [[UIViewController alloc] initWithNibName:#"myView" bundle:nil] ;
self.myView = myViewController.view;
[self.view addSubview:myView];
This code loads view from myView.nib (I have corresponding view controller m and h files of course). myView view has UITextField and other controls. So far so good - I can see all my controls on the screen.
The problem however is that even though I set a delegate for UITextField to be File's Owner (which is myView) and I implement UITextFieldDelegate in myView.m, delegate methods are never fired!
This does NOT happen if I add UITextField to the original view (created by the XCode as default template). Why is this happening?
The reason I need to useSubview because in actual code will layer view to the UIScrollView so I can pan and zoom.
THanks!
My first question to your question is, "is there a reason to use UIViewController to load your NIB file?".
It appears that you're "throwing away" the UIViewController and merely using it for its ability to load a NIB file. I'd stop that first, as that may help you debug this issue. Use:
self.myView = (UIView*)[NSBundle loadNibNamed:#"myView"];
The second part I'd question is that you say "File's Owner" -- because you're using a separate UIViewController, you may have it set to call back to your UIViewController, not the code that you mean to callback to. Maybe you could tell us a little about the setup of the XIB file?

Do something if view loads

I shift to my view by
[[self navigationController] popToViewController:controller animated:YES];
In that ViewController, I'm not able to get a notice, that it comes back to front (e.g. by viewWillAppear). I want to reload a table, as soon as the view is visible again.
How do I get a notice, that the view comes back on the screen?
----> solved: See my last comment on Corey's answer
viewWillAppear should be called if you are using a UINavigationController.
Are you sure you have added it correctly to the view hierarchy?
Did you check if viewWillDisappear gets called when it goes offscreen?
Did you try viewDidAppear just to make sure?
Did you spell the method name correctly?
To add:
Is the instance of UINavigationController added directly to the UIWindow instance?
The delegate methods like viewWillappear are sent from UIApplication (I believe). UIApplication only "knows" about viewControllers whose views are either:
Added Directly to UIWindow.
Added to a
UINavigationController/UITabBarCOntroller
that is added directly to UIWindow
(or a chain of these that leads to UIWindow).