Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6220399
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 24, 20262026-05-24T07:57:01+00:00 2026-05-24T07:57:01+00:00

I managed to customize the UIAlertView putting two UITextFields as subviews inside of it

  • 0

I managed to customize the UIAlertView putting two UITextFields as subviews inside of it but in doing so somehow the keyboard broke.

When I try to dismiss it resigning the first responder it doesn’t do anything just stays there.

Here’s my code, well, only relevant parts (this is what I put in a UIAlertView subclass):

#pragma mark -
#pragma mark UIView

- (void)layoutSubviews
{
    [super layoutSubviews];

    NSArray *subviews = [self subviews];
    UIView *backgroundView = [subviews objectAtIndex:0];
    CGRect firstFrame = [[subviews objectAtIndex:2] frame];
    CGRect backgroundFrame = [backgroundView frame];
    CGFloat displacement = kTextHeight * 2 + kPadding * 3;
    CGFloat pivot = firstFrame.origin.y + firstFrame.size.height;
    CGRect nameFrame = CGRectMake(firstFrame.origin.x,
            pivot + kPadding,
            kTextWidth, kTextHeight);
    CGRect descriptionFrame = CGRectMake(firstFrame.origin.x,
            pivot + kTextHeight + kPadding * 2,
            kTextWidth, kTextHeight);

    if (_nameField == nil && _descriptionField == nil) {
        // first UITextField
        _nameField = [[UITextField alloc] initWithFrame:CGRectZero];
        [_nameField setPlaceholder:kNamePlaceholder];
        [_nameField setBorderStyle:UITextBorderStyleRoundedRect];
        [_nameField setDelegate:self];
        // second UITextField
        _descriptionField =
                [[UITextField alloc] initWithFrame:CGRectZero];
        [_descriptionField setPlaceholder:kDescriptionPlaceholder];
        [_descriptionField setBorderStyle:UITextBorderStyleRoundedRect];
        [_descriptionField setDelegate:self];
        [self addSubview:_nameField];
        [self addSubview:_descriptionField];
    }
    // set the new frames to each text field
    [_nameField setFrame:nameFrame];
    [_descriptionField setFrame:descriptionFrame];
    // increment background image-view height by "displacement"
    backgroundFrame.size.height += displacement;
    [backgroundView setFrame:backgroundFrame];
    // displace by "diplacement" every subview positioned after "pivot"
    for (UIView *view in subviews) {
        CGRect viewRect = [view frame];

        if (viewRect.origin.y > pivot)
            [view setFrame:CGRectOffset(viewRect, 0., displacement)];
    }
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    return YES;
}

#pragma mark -
#pragma mark <UITextFieldDelegate>

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return NO;
}

Here’s my code in one big chunk:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

static CGFloat kTextWidth = 260.;
static CGFloat kTextHeight = 25.;
static CGFloat kPadding = 10.;
static NSString *kNamePlaceHolder = @"Name";
static NSString *kDescriptionPlaceHolder = @"Description";

// interfaces

@interface AppDelegate: NSObject <UIApplicationDelegate>
{
    UIWindow *_window;
}
- (void)showAlertView;
@end

@interface AlertView: UIAlertView <UITextFieldDelegate>
{
    UITextField *_nameField;
    UITextField *_descriptionField;
}
@end

// implementations

@implementation AppDelegate

#pragma mark -
#pragma mark NSObject

- (void)dealloc
{
    [_window release];
    [super dealloc];
}

#pragma mark -
#pragma mark AppDelegate

- (void)showAlertView
{
    AlertView *alertView = [[[AlertView alloc] initWithTitle:@"Title"
            message:@"Body" delegate:nil
            cancelButtonTitle:@"Ok" otherButtonTitles:nil] autorelease];
    [alertView show];
}

#pragma mark -
#pragma mark <UIApplicationDelegate>

- (BOOL)            application:(UIApplication *)application
  didFinishLaunchingWithOptions:(NSDictionary *)options
{
    _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [_window setBackgroundColor:[UIColor whiteColor]];
    [_window makeKeyAndVisible];
    [NSTimer scheduledTimerWithTimeInterval:3. target:self
            selector:@selector(showAlertView) userInfo:nil repeats:NO];
    return YES;
}
@end

@implementation AlertView

#pragma mark -
#pragma mark NSObject

- (void)dealloc
{
    [_nameField setDelegate:nil];
    [_descriptionField setDelegate:nil];
    [_nameField release];
    [_descriptionField release];
    [super dealloc];
}

#pragma mark -
#pragma mark UIView

- (void)layoutSubviews
{
    [super layoutSubviews];

    NSArray *subviews = [self subviews];
    UIView *backgroundView = [subviews objectAtIndex:0];
    CGRect firstFrame = [[subviews objectAtIndex:2] frame];
    CGRect backgroundFrame = [backgroundView frame];
    CGFloat displacement = kTextHeight * 2 + kPadding * 3;
    CGFloat pivot = firstFrame.origin.y + firstFrame.size.height;
    CGRect nameFrame = CGRectMake(firstFrame.origin.x,
            pivot + kPadding,
            kTextWidth, kTextHeight);
    CGRect descriptionFrame = CGRectMake(firstFrame.origin.x,
            pivot + kTextHeight + kPadding * 2,
            kTextWidth, kTextHeight);

    if (_nameField == nil && _descriptionField == nil) {
        // first UITextField
        _nameField = [[UITextField alloc] initWithFrame:CGRectZero];
        [_nameField setPlaceholder:kNamePlaceholder];
        [_nameField setBorderStyle:UITextBorderStyleRoundedRect];
        [_nameField setDelegate:self];
        // second UITextField
        _descriptionField =
                [[UITextField alloc] initWithFrame:CGRectZero];
        [_descriptionField setPlaceholder:kDescriptionPlaceholder];
        [_descriptionField setBorderStyle:UITextBorderStyleRoundedRect];
        [_descriptionField setDelegate:self];
        [self addSubview:_nameField];
        [self addSubview:_descriptionField];
    }
    // set the new frames to each text field
    [_nameField setFrame:nameFrame];
    [_descriptionField setFrame:descriptionFrame];
    // increment background image-view height by "displacement"
    backgroundFrame.size.height += displacement;
    [backgroundView setFrame:backgroundFrame];
    // displace by "diplacement" every subview positioned after "pivot"
    for (UIView *view in subviews) {
        CGRect viewRect = [view frame];

        if (viewRect.origin.y > pivot)
            [view setFrame:CGRectOffset(viewRect, 0., displacement)];
    }
}


- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    return YES;
}

#pragma mark -
#pragma mark <UITextFieldDelegate>

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return NO;
}
@end

int main(int argc, char **argv)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil,
            NSStringFromClass([AppDelegate class]));
    [pool drain];
    return retVal;
}
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-24T07:57:01+00:00Added an answer on May 24, 2026 at 7:57 am

    My solution was to override becomeFirstResponder in the UIAlertView subclass:

    - (BOOL)becomeFirstResponder
    {
        // For some unkown reason UIAlertView can be first responder. Disabling
        // this completely fixes this bug http://stackoverflow.com/q/6866932/434423
        // BTW, overriding "canBecomeFirstResponder" to return "NO" doesn't work,
        // this is why we override this instead of "canBecomeFirstResponder".
        return NO;
    }
    

    I’ll post all my code in case someone needs it. Properly handles UIAlertView customization.


    CustomizableAlertView.h

    @class UIAlertView;
    
    @interface CustomizableAlertView: UIAlertView
    {
        UIView *_customSubview;
    }
    @property (nonatomic, retain) UIView *customSubview;
    @end
    

    CustomizableAlertView.m

    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import <QuartzCore/QuartzCore.h>
    
    #import "CustomizableAlertView.h"
    
    static CGFloat kVerticalPadding = 10.;
    static CGFloat kMinHorizontalPadding = 12.;
    static NSString *kTransformKeyPath = @"transform";
    
    @interface CustomizableAlertView (Private)
    
    - (void)centerViewOnKeyboardDismissal:(UIControl *)control;
    @end
    
    @implementation CustomizableAlertView
    
    #pragma mark -
    #pragma mark NSObject
    
    - (void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        [_customSubview release];
        [super dealloc];
    }
    
    #pragma mark -
    #pragma mark NSObject (NSKeyValueObserving)
    
    - (void)observeValueForKeyPath:(NSString *)keyPath
                          ofObject:(id)object
                            change:(NSDictionary *)change
                           context:(void *)context
    {
        // Make sure we are observing kTransformKeyPath from self
        if (_customSubview != nil && self == object &&
                [keyPath isEqualToString:kTransformKeyPath]) {
            // We should remove the observing object to avoid a recursion
            [self removeObserver:self forKeyPath:kTransformKeyPath];
    
            CGFloat displacement =
                    [_customSubview frame].size.height / 2. + kVerticalPadding;
    
            [self setTransform:
                    CGAffineTransformMakeTranslation(.0, -displacement)];
            // Resume the observation
            [self addObserver:self forKeyPath:kTransformKeyPath options:0
                    context:NULL];
        }
    }
    
    #pragma mark -
    #pragma mark UIResponder
    
    - (BOOL)becomeFirstResponder
    {
        // For some unkown reason UIAlertView can be first responder. Disabling
        // this completely fixes this bug http://stackoverflow.com/q/6866932/434423
        // BTW, overriding "canBecomeFirstResponder" to return "NO" doesn't work,
        // this is why we override this instead of "canBecomeFirstResponder".
        return NO;
    }
    
    #pragma mark -
    #pragma mark UIView
    
    - (void)layoutSubviews
    {
        [super layoutSubviews];
    
        NSArray *subviews = [self subviews];
        UIView *messageView = nil;
        UIView *backgroundView = nil;
    
        // Perform a pattern search instead of depending on UIAlertView internal
        // structure.
        // This fetches the background view.
        for (UIView *view in subviews) 
            if ([view isKindOfClass:[UIImageView class]]) {
                backgroundView = view;
                break;
            }
        // Perform a pattern search instead of depending on UIAlertView internal
        // structure
        // This fetches the view that we'll use as an anchor.
        for (UIView *view in subviews)
            if ([view isKindOfClass:[UILabel class]] &&
                    [[(UILabel *)view text] isEqualToString:[self message]]) {
                messageView = view;
                break;
            }
        if (backgroundView == nil || messageView == nil)
            // Abort if there were no matches
            return;
    
        CGRect bounds = [self bounds];
        CGRect messageFrame = [messageView frame];
        CGRect backgroundFrame = [backgroundView frame];
        CGRect customFrame = [_customSubview frame];
        CGFloat displacement = customFrame.size.height  + kVerticalPadding * 2.;
        CGFloat pivot = messageFrame.origin.y + messageFrame.size.height;
    
        // increment background image-view height by "displacement"
        backgroundFrame.size.height += displacement;
        [backgroundView setFrame:backgroundFrame];
        // displace by "diplacement" every subview positioned after "pivot"
        for (UIView *view in subviews) {
            CGRect viewRect = [view frame];
    
            if (viewRect.origin.y > pivot)
                [view setFrame:CGRectOffset(viewRect, .0, displacement)];
        }
    
        CGFloat maxWidth = bounds.size.width - kMinHorizontalPadding * 2.;
    
        if (customFrame.size.width > maxWidth)
            customFrame.size.width = maxWidth;
        [_customSubview setFrame:CGRectOffset(customFrame,
                (bounds.size.width - customFrame.size.width) / 2.,
                pivot + kVerticalPadding)];
        if ([_customSubview superview] == nil)
            [self addSubview:_customSubview];
    }
    
    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
        // perform hit-test for every subview
        for (UIView *view in [self subviews])
            if ([view pointInside:[self convertPoint:point toView:view]
                    withEvent:event])
                return YES;
        return NO;
    }
    
    #pragma mark -
    #pragma mark UIAlertView
    
    - (void)show
    {
        NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
    
        [defaultCenter addObserver:self
            selector:@selector(centerViewOnKeyboardDismissal:)
            name:UITextFieldTextDidEndEditingNotification object:nil];
        [defaultCenter addObserver:self
                selector:@selector(centerViewOnKeyboardDismissal:) 
                name:UITextViewTextDidEndEditingNotification object:nil];
        // Dammit! we need to observe value-changes for the property "transform" to
        // handle properly the UIAlertView relocation.
        // We need to hang this onto "show" because UIAlertView's designated
        // initializer is imposible to override due to its variadic parameter (...).
        [self addObserver:self forKeyPath:kTransformKeyPath options:0 context:NULL];
        [super show];
    }
    
    - (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex
                                 animated:(BOOL)animated
    {
        // Cease to observe kTransformKeyPath upon dismissal
        [self removeObserver:self forKeyPath:kTransformKeyPath];
        [super dismissWithClickedButtonIndex:buttonIndex animated:animated];
    }
    
    #pragma mark -
    #pragma mark CustomizableAlertView
    
    @synthesize customSubview = _customSubview;
    
    - (void)centerViewOnKeyboardDismissal:(UIControl *)control
    {
        CGRect bounds = [[self superview] bounds];
    
        [self setCenter:CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))];
    }
    @end
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I managed to get the YUI calendar widget working fine. But When it displays
I managed to get this to work a while back, but on returning to
I'm trying to customize the session management filter of Spring Security, but I get
I have a Model that's managed by Django Admin. How to I customize the
I managed to create a class using CodeDom and add a single method to
The Managed Extensibility Framework (MEF) and Managed AddIn Framework (MAF, aka System.AddIn) seem to
I managed to get some help from a previous question and I have the
Does managed C++ have an equivalent to C#'s lock() and VB's SyncLock? If so,
I managed to show the output of a shell command in TextArea of flex
From managed code, how do I load a managed type from another assembly at

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.